%\iffalse
% glossary.dtx generated using makedtx version 0.91b (c) Nicola Talbot
% Command line args:
%   -macrocode ".*\.p.*l"
%   -macrocode ".*\.bat"
%   -macrocode ".*\.tex"
%   -setambles ".*\.p.*l=>\nopreamble\nopostamble"
%   -setambles ".*\.bat=>\nopreamble\nopostamble"
%   -src "(.+)\.(sty)\Z=>\1.\2"
%   -src "(.+)\.(pl)\Z=>\1.\2"
%   -src "(.+)\.(bat)\Z=>\1.\2"
%   -src "(.+)\.(perl)\Z=>\1.\2"
%   -src "(.+)\.(tex)\Z=>\1.\2"
%   -doc "manual.tex"
%   -author "Nicola Talbot"
%   -prefinale "\\fi"
%   -dir "source"
%   glossary
% Created on 2006/7/25 18:13
%\fi
%\iffalse
%<*package>
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%</package>
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
% Copyright (C) 2006 Nicola Talbot, all rights reserved.
% \fi
% \iffalse
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage{ifthen}
\usepackage[colorlinks,
            bookmarks,
            hyperindex=false,
            pdfauthor={N.L.C. Talbot},
            pdftitle={glossary.sty: LaTeX2e Package to Assist Generating Glossaries},
            pdfkeywords={LaTeX,package,glossary,acronym}]{hyperref}

 %hyperindex conflicts with doc
 %(end up with |usage|hyperpage in indexentry)
 %This unfortunately means that the changes section doesn't
 %have active links, but at least it will keep makeindex happy.


\renewcommand{\usage}[1]{\textit{\hyperpage{#1}}}
\renewcommand{\main}[1]{\hyperpage{#1}}
\newcommand{\see}[2]{\emph{see} #1}
\makeatletter
\def\index@prologue{\section*{Index}}
\makeatother
\RecordChanges
\PageIndex
 %\OnlyDescription


\newcommand{\cmdname}[1]{\texttt{\symbol{92}#1}}
\newcommand{\istkey}[1]{\texttt{#1}\index{makeindex key>#1|hyperpage}}
\newcommand{\icmdname}[1]{\texttt{\symbol{92}#1}\SpecialMainIndex{#1}}
\newcommand{\appname}[1]{\texttt{#1}\index{#1=\texttt{#1}|hyperpage}}
\newcommand{\gloskey}[1]{\texttt{#1}\index{glossary keys=\cmdname{glossary} keys>#1|hyperpage}}
\newcommand{\setglos}[1]{\texttt{#1}\index{setglossary keys=\cmdname{setglossary} keys>#1|hyperpage}}
\newcommand{\glsnumfmt}[1]{\texttt{#1}%
\index{page number formats>#1|hyperpage}%
\index{glossary keys=\cmdname{glossary} keys>format>#1|hyperpage}}
\newcommand{\pkgopt}[2][]{%
\ifthenelse{\equal{#1}{}}{%
\texttt{#2}\index{package options>#2|hyperpage}}{%
\texttt{#2=#1}\index{package options>#2>#1|hyperpage}}}
\newcommand{\pkgoptval}[2]{\texttt{#1}\index{package options>#2>#1|hyperpage}}
\newcommand{\filetype}[1]{\texttt{#1}\index{file types>#1|hyperpage}}
\newcommand{\styname}[1]{\textsf{#1}\index{#1=\textsf{#1}|hyperpage}}
\newcommand{\envname}[1]{\textsf{#1}}


\begin{document}
\DocInput{glossary.dtx}
\end{document}
%</driver>
%\fi
%\MakeShortVerb{"}
%\DeleteShortVerb{\|}
%
% \title{glossary.sty v 2.4: \LaTeXe\ Package to Assist Generating Glossaries}
% \author{Nicola L.C. Talbot}
% \date{20th July 2006}
% \maketitle
%\tableofcontents
%
% \section{Introduction}
% \changes{1.0}{2004 July 29}{Initial version}
% The \styname{glossary} package is provided to assist 
%generating a glossary.  It has a certain amount of flexibility, 
%allowing the user to customize the format of the glossary, and 
%define new glossary-style objects.
%
%\section{Installation}
%
%You need to make sure you have downloaded the following three
%files:
%\begin{verbatim}
%glossary.ins
%glossary.dtx
%README
%\end{verbatim}
%To extract the code from the \texttt{glossary.dtx} file, you 
%will need to run the installation file through LaTeX:
%\begin{verbatim}
%latex glossary.ins
%\end{verbatim}
%This will create the following files:
%\begin{verbatim}
%glossary.sty
%glossary.perl
%makeglos.pl
%makeglos.bat
%\end{verbatim}
%along with several sample files. The file \texttt{glossary.sty}
%should be placed somewhere in the \LaTeX\ path, e.g.\ 
%\texttt{texmf/tex/latex/glossary/} or 
%\texttt{localtexmf/tex/latex/glossary/}. Remember to update the
%\TeX\ database if you are installing this package for the first time. 
%The file \texttt{glossary.perl} is a \LaTeX2HTML\ style file, and 
%should be placed in the \LaTeX2HTML\ style file directory (usually 
%\texttt{latex2html/styles/}). The file \texttt{makeglos.pl}
%is a Perl script which calls \appname{makeindex}.  If you are
%using UNIX or Linux, you will need to set the permissions so
%that you can execute the file:
%\begin{verbatim}
%chmod a+x makeglos.pl 
%\end{verbatim}
%You should then place this file somewhere on your path. 
%(You may also need to edit the first line of
%this file, if \appname{perl} is located in a directory other than \verb"/usr/bin/"\footnote{and you can also remove the \texttt{.pl}
%extension which isn't to everyone's liking.}.)
%
%If you are not using UNIX or Linux etc, you may have to explicitly
%load the file into Perl, so you would need to do 
%\texttt{perl makeglos.pl} instead of just \texttt{makeglos.pl}.
%If you are using Windows, a batch file, \texttt{makeglos.bat} 
%is provided which will run Perl on \texttt{makeglos.pl}.
%Both \texttt{makeglos.pl} and \texttt{makeglos.bat} should
%be placed somewhere specified by the PATH environment
%variable. (For example, put them both in the same 
%directory as \appname{makeindex}, which will probably
%be in \verb+\texmf\miktex\bin\+).
%\changes{2.22}{2005 Sept 12}{added makeglos.bat file}
%
%If you don't have Perl installed on your system, you can just use
%\appname{makeindex}, only you will have to remember all the 
%command line switches, and you won't be able to merge entries 
%that have the same name, but different descriptions.
%
%Note that if you are updating the glossary package, it is
%a good idea to update \texttt{makeglos.pl} as it may also
%have been modified.
%
% \section{Generating Glossary Information}
%
% The standard \LaTeX\ command \cmdname{makeglossary}\DescribeMacro{\makeglossary}{} (analogous to \cmdname{makeindex})
% should be placed in the document preamble. If this command
%is omitted, glossary information will be ignored.  Glossary 
%entries are generated using the command 
%\cmdname{glossary}\verb"{"\meta{key-val list}\verb'}'\DescribeMacro{\glossary}.
% This command is a slightly modified version of the standard 
%\cmdname{glossary} command, in order to separate out the 
%information into \meta{entry-name} and \meta{entry-description}. 
%The argument to \cmdname{glossary} must be a comma-separated
%list of \meta{key}=\meta{value} pairs.  The following keys are 
%available:
%\begin{center}
%\begin{tabular}{lp{0.8\linewidth}}
%\bfseries Key & \bfseries Value\\
%\ttfamily \gloskey{name} & The entry name\\
%\ttfamily \gloskey{description} & A description about the entry\\
%\ttfamily \gloskey{sort} & How to sort the entry. (Entry name used if sort omitted)\\
%\ttfamily \gloskey{format} & How to format the page number\\
%\ttfamily \gloskey{number} & Override the page number with a different 
%counter. The value should be the name of a counter (e.g.\ 
%\texttt{number=section}).
%\end{tabular}
%\end{center}
% For example:
%\begin{verbatim}
%\glossary{name={singular matrix},
%          description={A matrix with zero determinant}}
%\end{verbatim}
% The following example sorts on the text \texttt{U} instead of 
%\verb"$\mathcal{U}$":
%\begin{verbatim}
%\glossary{name={$\mathcal{U}$},
%          description={The universal set},
%          sort=U}
%\end{verbatim}
%Note that you should always use the \gloskey{sort}
%key if the \gloskey{name} key contains commands, this is particularly
%important if you are using hyperlinks, as the target is constructed
%from the \gloskey{name} key if the \gloskey{sort} key is omitted.
%
%In the glossary, each entry is followed by a list of page numbers
%that correspond to the pages where the relevant \cmdname{glossary}
%command is placed. By default the numbers are formatted in the 
%current font, but the page number format for individual entries can be 
%changed using the \gloskey{format} key.  This should be the name of a 
%\LaTeX\ formatting command without the preceding \verb'\' (as with the 
%\verb'|' operator in \cmdname{index}.)  For example:
%\begin{verbatim}
%\glossary{name={$\mathbb{R}$},
%          description={The set of real numbers},
%          sort=R,
%          format=textbf}
%\end{verbatim}
%In addition, the following formats are also available:
%\changes{2.0}{2004 September 21}{Hyper page formats: 
%\texttt{'hypersf}, \texttt{'hypertt}, \texttt{'hyperbf} and 
%\texttt{'hyperbf}}
%\changes{2.12}{2004 November 1}{Hyper page format: 
%\texttt{'hyperrm}}
%\changes{2.4}{2006 July 20}{Hyper page formats updated to take two
%arguments. Additional formats also provided}
%\begin{center}
%\begin{tabular}{ll}
%\glsnumfmt{hyperrm} & The number is a hyper link in roman \\
%\glsnumfmt{hypersf} & The number is a hyper link in sans-serif \\
%\glsnumfmt{hypertt} & The number is a hyper link in typewriter font \\
%\glsnumfmt{hyperbf} & The number is a hyper link in bold \\
%\glsnumfmt{hypermd} & The number is a hyper link in medium weight \\
%\glsnumfmt{hyperit} & The number is a hyper link in italic\\
%\glsnumfmt{hypersl} & The number is a hyper link in slanted font\\
%\glsnumfmt{hyperup} & The number is a hyper link in upright font\\
%\glsnumfmt{hypersc} & The number is a hyper link in small caps\\
%\glsnumfmt{hyperem} & The number is a hyper link using \cmdname{emph}
%\end{tabular}
%\end{center}
%If the \pkgopt{hyper} option has not been set,
%\glsnumfmt{hyperem} is equivalent to \texttt{emph}, and the remaining
%\glsnumfmt{hyperrm} etc are equivalent to \texttt{textrm} etc.
%Note that it is important the you use \texttt{hyperrm} instead of 
%\texttt{hyperpage}, as the \cmdname{hyperpage} command won't
%work on a list or range of numbers in the glossary%
%\footnote{This is because the list and number ranges are 
%delimited using \cmdname{delimR} and \cmdname{delimN} instead of 
%explicitly using a comma or en-dash.}. If you want to define your
%own command that uses hyper links, it must be defined in an 
%analogous manner to \icmdname{hyperrm}. For example, if you want
%to display a page number in a bold italic format, that contains a 
%hyperlink to the appropriate page, you would need to define it as
%follows:
%\begin{verbatim}
%\newcommand{\hyperbfit}[2][\gls@number]{%
%\textbf{\itshape\glshyper{#1}{#2}}}
%\end{verbatim}
%As can be seen from the definition, all the \cmdname{hyper}\meta{xx}
%commands have an optional argument. This argument is the name of the
%counter being used. You do not need to worry about this argument if
%you only use these commands within the \icmdname{glossary} command.
%So the previous example can simply be rewritten as:
%\begin{verbatim}
%\glossary{name={$\mathbb{R}$},
%          description={The set of real numbers},
%          sort=R,
%          format=hyperbf}
%\end{verbatim}
%
%\textbf{Note:} although the numbers in the glossary are referred to
%as ``page'' numbers in this manual, they may in fact refer to some
%other counter, such as the \texttt{section} counter, depending on 
%whether the \gloskey{number} key has been used.
%
%As with the \cmdname{index} command, care must be taken if you
%want to use the special characters: \verb'@' \verb/|/ \verb+"+ and
%\verb'!'.  These characters should be preceded by the double quote
%character. For example:
%\begin{verbatim}
%\glossary{name={$"|\mathcal{S}"|$,
%description=The cardinality of the set \mathcal{S}}}
%\end{verbatim}
%There is no provision for sub-entries, as these are 
%generally only applicable in an index, and not in a glossary.
%
%\changes{2.14}{2005 May 28}{'xglossary added}%
%As from version 2.14, there is an additional command available:
%\DescribeMacro{\xglossary}
%\par\vspace{10pt}\noindent\cmdname{xglossary}\verb'{'\meta{gls-entry}%
%\verb'}{'\meta{text}\verb"}"
%\par\vspace{10pt}\noindent This is equivalent to\meta{text}\icmdname{glossary}\verb'{'\meta{gls-entry}\verb"}",
%where \meta{text} will be made a hyper link to the
%relevant entry in the glossary, if hyper
%links are supported.
%
%\subsection{Storing Glossary Information}
%
%It is very cumbersome having to use the \icmdname{glossary} command 
%throughout your document, every time you use a term that you want in 
%your glossary. This is particularly true for terms with a long
%description. The \styname{glossary} package provides a means
%of storing the glossary information at the beginning of the document,
%and then using it whenever required. It is strongly recommended
%that you use this approach, rather than explicity using the 
%\icmdname{glossary} command.
%
%\changes{2.17}{2005 June 28}{'storeglosentry added}
%\DescribeMacro{\storeglosentry}
%The following command:\\[10pt]
%\begin{ttfamily}
%\cmdname{storeglosentry}[\textrm{\meta{gls-type}}]\{\textrm{\meta{label}}\}\{\textrm{\meta{gls-entry}}\}
%\end{ttfamily}\\[10pt]
%can be used to store glossary information, where \meta{label} is
%a unique label assigned to this entry. The information
%can then be used later with any of the following commands:\\[10pt]
%\changes{2.14}{2005 May 28}{'useglosentry added}
%\changes{2.14}{2005 May 28}{'useGlosentry added}
%\changes{2.18}{2005 July 5}{'gls added}
%\begin{ttfamily}
%\cmdname{useglosentry}[\textrm{\meta{opt}}]\{\textrm{\meta{label}}\}\DescribeMacro{\useglosentry}\\
%\cmdname{useGlosentry}[\textrm{\meta{opt}}]\{\textrm{\meta{label}}\}\{\textrm{\meta{text}}\}\DescribeMacro{\useGlosentry}\\
%\cmdname{gls}[\textrm{\meta{opt}}]\{\textrm{\meta{label}}\}\DescribeMacro{\gls}
%\end{ttfamily}\\[10pt]
%\cmdname{useglosentry} adds the glossary entry whose label is given by
%\meta{label} to the appropriate glossary, 
%\cmdname{useGlosentry} adds the glossary entry, and 
%makes \meta{text} a hyperlink to that entry (if hyperlinks are
%supported). The third command, \cmdname{gls}, is like
%\cmdname{useGlosentry}, but forms \meta{text} from the name
%given in the glossary entry.
%
%Returning to an earlier example, instead of typing:
%\begin{verbatim}
%\glossary{name={$\mathcal{U}$},
%          description={The universal set},
%          sort=U}
%\end{verbatim}
%every time you want to add this entry to the glossary, you 
%can instead store the information:
%\changes{2.19}{2005 July 8}{fixed bug in 'storeglosentry}
%\begin{verbatim}
%\storeglosentry{glos:U}{name={$\mathcal{U}$},
%          description={The universal set},
%          sort=U}
%\end{verbatim}
%Now, instead of continually copying and pasting the glossary command 
%for this entry (which can have quite a large \gloskey{description} 
%field), you can use either:
%\begin{verbatim}
%\useglosentry{glos:U}
%\end{verbatim}
%which is equivalent to:
%\begin{verbatim}
%\glossary{name={$\mathcal{U}$},
%          description={The universal set},
%          sort=U}
%\end{verbatim}
%or you can use:
%\begin{verbatim}
%\useGlosentry{glos:U}{text}
%\end{verbatim}
%which is equivalent to:
%\begin{verbatim}
%\xglossary{name={$\mathcal{U}$},
%          description={The universal set},
%          sort=U}{text}
%\end{verbatim}
%or you can use:
%\begin{verbatim}
%\gls{glos:U}
%\end{verbatim}
%which is equivalent to:
%\begin{verbatim}
%\xglossary{name={$\mathcal{U}$},
%          description={The universal set},
%          sort=U}{$\mathcal{U}$}
%\end{verbatim}
%If you want to use glossary entries in an equation, it is better
%to use \cmdname{ensuremath} instead of \verb|$|\ldots\verb'$'.
%For example:
%\begin{verbatim}
%\storeglosentry{Gamma}{name=\ensuremath{\Gamma(z)},
%description=Gamma function,
%sort=Gamma}
%\end{verbatim}
%You can then use this entry in either text or math mode:
%\begin{verbatim}
%The \useGlosentry{Gamma}{Gamma function} is defined as
%\begin{equation}
%\gls{Gamma} = \int_{0}^{\infty}e^{-t}t^{z-1}\,dt
%\end{equation}
%\end{verbatim}
%If you are using hyper links, and you want to use 
%\cmdname{useGlosentry} within math mode, you must use 
%\cmdname{ensuremath}:
%\begin{verbatim}
%\begin{equation}
%\useGlosentry{Gamma}{\ensuremath{\Gamma(x+1)}} = x\Gamma(x)
%\end{equation}
%\end{verbatim}
%
%The optional argument to \icmdname{storeglosentry} (\meta{gls-type}) 
%indicates the glossary type (see 
%\autoref{sec:newglostype} to find out how to define new 
%glossary types).  If omitted, the standard glossary is used.
%
%The optional argument to \icmdname{useglosentry}, 
%\icmdname{useGlosentry} and \icmdname{gls} (\meta{opt}) allows you to 
%add additional information to the glossary entry, for example:
%\begin{verbatim}
%\useglosentry[format=textbf]{glos:U}
%\end{verbatim}
%is equivalent to:
%\begin{verbatim}
%\glossary{name={$\mathcal{U}$},
%          description={The universal set},
%          sort=U,
%          format=textbf}
%\end{verbatim}
%Since version 2.4, \icmdname{storeglosentry} is robust, and 
%\cmdname{protect} should no longer be needed, however 
%the identifying label, \meta{label}, should not 
%contain any special characters.
%
%As from version 2.36, if you want to use all glossary entries
%which have been defined using \cmdname{storeglosentry}, do:
%\verb|\useglosentry{*}|. (Note that this option is not
%available for \cmdname{useGlosentry} and \cmdname{gls}.)
%
%\section{makeglos.pl}
%
%Whenever a glossary entry is used, either explicity using
%\cmdname{glossary} or \cmdname{xglossary} or implicitly using
%\cmdname{useglosentry}, \cmdname{useGlosentry} and \cmdname{gls},
%the information is saved in a file with the extension \filetype{glo}
%(unless the \icmdname{makeglossary} command is omitted, in which case 
%the glossary information is simply ignored.) A \appname{makeindex} 
%style file\index{makeindex style file (.ist)|see{file types, ist}}
%(\filetype{ist}) is also created, which is customized for the 
%document, and can be passed to \appname{makeindex}.
%
%For example, suppose your document is called \texttt{mydoc.tex},
%the glossary will be saved in the file 
%\texttt{mydoc.}\filetype{glo}, and the \appname{makeindex} style
%file \texttt{mydoc.}\filetype{ist} will be created.
% These files can then be passed to \appname{makeindex} as follows:
%\begin{verbatim}
%makeindex -s mydoc.ist -t mydoc.glg -o mydoc.gls mydoc.glo
%\end{verbatim}
%which generates the output file \texttt{mydoc.}\filetype{gls},
%with transcript written to
%\texttt{mydoc.}\filetype{glg}.  
%
%The Perl script \appname{makeglos.pl} provided with this package
%allows you to use \appname{makeindex} without having to remember
%all the command line options.  The command
%\begin{verbatim}
%makeglos.pl mydoc
%\end{verbatim}
%will perform the command:
%\begin{verbatim}
%makeindex -s mydoc.ist -t mydoc.glg -o mydoc.gls mydoc.glo
%\end{verbatim}
%In addition, \appname{makeglos.pl} also takes the option 
%\texttt{-m} which can be used to collate entries where the
%same name has multiple descriptions.
%\changes{2.14}{2005 May 28}{makeglos -m switch added}
%
%\appname{makeglos.pl} has the following syntax:
%\begin{verbatim}
%makeglos.pl [-ilqrgm] [-s sty] [-o gls] [-t log] [-p num] <filename>
%\end{verbatim}
%where all switches, apart from \texttt{-m} are the same as
%those for \appname{makeindex}. If there are multiple glossary types 
%(see
%\autoref{sec:newglostype}) and the file extension is omitted, \appname{makeglos.pl} will
%iterate through each glossary type (it will pick up the relevant 
%information from the auxiliary file).
%
%The name of the \filetype{ist} file can be changed by redefining
%the command \cmdname{istfilename}\DescribeMacro{\istfilename}
%\emph{before} \cmdname{makeglossary}. 
%For example:
%\begin{verbatim}
%\renewcommand{\istfilename}{foo.ist}
%\makeglossary
%\end{verbatim}
%Only one \filetype{ist} file will be created per document, even if
%you have multiple glossaries with different styles. The only
%circumstance where you will need multiple \filetype{ist} files for
%a single document is when you have multiple glossaries that use
%different counters with different compositors, but this is rarely 
%likely to occur.
%
%Creation of the \filetype{ist} file can be suppressed by issuing
%the command \cmdname{noist}\DescribeMacro{\noist}\ before
%\icmdname{makeglossary}.  It will also be suppressed when the
%command \icmdname{nofiles} is used, or if the command 
%\icmdname{makeglossary} is omitted.
%
%It should be noted that there are a few packages that can
%cause problems with the creation of the \filetype{ist} file,
%for example \styname{ngerman}.  If you encounter problems
%when \LaTeX\ is processing the \icmdname{makeglossary} command,
%or if you get errors from \appname{makeindex} complaining about
%the style file, this is the most probable cause.
%See \autoref{sec:trouble}, item~\ref{itm:ngerman} for 
%information on how to fix this.
%
%\section{Displaying the Glossary}
%
% Once the \filetype{gls} file has been created by
%\appname{makeindex} (as described in the previous
% section) the glossary can then be included in the document with
%the command \cmdname{printglossary}\DescribeMacro{\printglossary}.
% If chapters are defined, the glossary will start
%with\SpecialMainIndex{glossaryname}
%\begin{verbatim}
%\chapter*{\glossaryname}
%\end{verbatim}
%If not, it will start with
%\begin{verbatim}
%\section*{\glossaryname}
%\end{verbatim}
%The format of the main body of the glossary depends on the
%options passed to the package.
%
%\section{Package Options}
%\label{sec:options}
%
%The package options must be specified as a comma-separated list 
%of \meta{key}=\meta{value} pairs.  Available options are:
%\begin{description}
%\item[\pkgopt{style}] The glossary style. Values:
%\index{glossary style|see{package options, style}}
%\begin{description}
%\item[\pkgoptval{list}{style}] use 
%\envname{description} environment in the glossary
%\item[\pkgoptval{altlist}{style}] modified 
%version of \pkgopt[list]{style}.  The description starts on the
%line following the name of the term being defined.
%\changes{2.0}{2004 September 21}{Package option \texttt{altlist} 
%style}
%\item[\pkgoptval{super}{style}] use 
%\envname{supertabular} environment in the glossary
%\item[\pkgoptval{long}{style}] use 
%\envname{longtable} environment in the glossary (Default)
%\end{description}
%
%\item[\pkgopt{header}]\index{glossary header|see{package options, header}} Glossary 
%header. Values:
%\begin{description}
%\item[\pkgoptval{none}{header}] The glossary 
%doesn't have a heading (Default)
%\item[\pkgoptval{plain}{header}] The glossary 
%has a heading
%\end{description}
%
%\item[\pkgopt{border}]\index{glossary border|see{package options, border}} Glossary 
%border.  Values:
%\begin{description}
%\item[\pkgoptval{none}{border}] The glossary 
%doesn't have a border (Default)
%\item[\pkgoptval{plain}{border}] Border 
%around the main body of the glossary
%\end{description}
%
%\item[\pkgopt{cols}]\index{glossary columns|see{package options, cols}} Number of 
%columns. Values:
%\begin{description}
%\item[\pkgoptval{2}{cols}] The entry name and description are in two separate 
%columns with the associated page numbers in the same column as 
%the description. (Default)
%\item[\pkgoptval{3}{cols}] The entry name, description and associated page numbers 
%are in three separate columns.
%\end{description}
%
% \changes{1.1}{2004 August 14}{Package option \texttt{number}}
% \changes{2.4}{2006 July 20}{Package option \texttt{number} modified
%so that any counter can be used}
%\item[\pkgopt{number}]
% Associated number corresponding to each entry.
%This may either be the keyword \pkgoptval{none}, indicating that
%the corresponding numbers should be suppressed, or it can be the
%name of a \LaTeX\ counter. The default is \pkgopt[page]{number}.
%
%\item[\pkgopt{toc}]\index{table of contents, adding to|see{package options, toc}}
%Boolean variable:
%\changes{2.0}{2004 September 21}{Package option \texttt{toc}}
%\begin{description}
%\item[\pkgoptval{true}{toc}] Add glossary to table of contents
%\item[\pkgoptval{false}{toc}] Omit glossary from table of contents (Default)
%\end{description}
%Note that if you specify this option, you will need to run 
%\LaTeX\ twice after generating the glossary.
%
%\item[\pkgopt{hypertoc}]
%Boolean variable. This is similar to the package option
%\pkgopt{toc}, but if you are using the \styname{hyperref} 
%package, \pkgopt{hypertoc} will generate a link to the
%point immediately before the glossary title, whereas \pkgopt{toc} will 
%have a hyperlink to just after the glossary title. Note
%that you can not use both \pkgopt[true]{toc} and 
%\pkgopt[true]{hypertoc}. Default value: 
%\pkgopt[false]{hypertoc}.
%\changes{2.24}{2005 September 27}{Package option \texttt{hypertoc}}
%
%\item[\pkgopt{hyper}] Boolean
%variable:
%\changes{2.0}{2004 September 21}{Package option \texttt{hyper}}
%\begin{description}
%\item[\pkgoptval{true}{hyper}] Make associated numbers in the 
%glossary a hypertext link, and also make acronyms, and the text
%given by \icmdname{xglossary} have a hyperlink to their 
%corresponding entries in the glossary.
%\item[\pkgoptval{false}{hyper}] Don't make associated numbers a hypertext link
%\end{description}
%If the \styname{hyperref} or \styname{html} package has 
%been loaded prior to loading \texttt{glossary.sty}, 
%\pkgopt[true]{hyper} is set, otherwise
%the default is \pkgopt[false]{hyper}. Note that this package
%option now encompasses the old \pkgopt{hyperacronym} option.
%
%\item[\pkgopt{section}] Boolean variable:
%\changes{2.12}{2004 November 1}{Package option \texttt{section}}
%\begin{description}
%\item[\pkgoptval{true}{section}] Make the glossary an unnumbered 
%section, even if chapters are defined%
%
%\item[\pkgoptval{false}{section}] Only make glossary an 
%unnumbered section if chapters are not defined (default).
%\end{description}
%
%\item[\pkgopt{acronym}] Boolean variable:
%\changes{2.17}{2005 June 28}{Package option \texttt{acronym}}
%\begin{description}
%\item[\pkgoptval{true}{acronym}] Make the list of acronyms
%separate from the main glossary.
%
%\item[\pkgoptval{false}{acronym}] The acronyms will all 
%be placed in the main glossary. (Default)
%\end{description}
%
%\item[\pkgopt{global}] Boolean variable:
%\changes{2.31}{2005 December 5}{Package option \texttt{global}}
%\begin{description}
%\item[\pkgoptval{false}{global}] Acronym commands only have
%a local effect. (Default)
%\item[\pkgoptval{true}{global}] Acronym commands have a global
%effect.
%\end{description}
%\end{description}
% The \pkgopt{border}, \pkgopt{header} and \pkgopt{cols} options 
%should not be used in conjunction with \pkgopt[list]{style}
%or \pkgopt[altlist]{style}, as they only make sense with one of 
%the tabular-style options.
%The value for the boolean variables can be omitted if they are 
%to be set.  For example
% \pkgopt{toc} is equivalent to \pkgopt[true]{toc}.  Note that the 
%\pkgoptval{altlist}{style} style is better suited to 
%glossaries with long entry names.
%
%You can set up your own preferred defaults in a configuration
%file%
%\index{glossary.cfg|see{file type, cfg}}.  
%The file must be called \texttt{glossary.}\filetype{cfg} and
%should be placed somewhere on the \TeX\ path. In this file you
%can use the command \DescribeMacro{\glossarypackageoptions}%
%\noindent
%\cmdname{glossarypackageoptions}\verb'{'\meta{option-list}\verb/}/
%\noindent
%where \meta{option-list} is a comma-separated list of 
%\meta{key}=\meta{value} pairs, as passed to the 
%\styname{glossary}
%package. Note that this command may only be used in the
%configuration file.
%
%\subsection{Examples}
% Suppose the document has the following \icmdname{glossary}
%commands:
%\begin{center}\ttfamily
%\begin{tabular}{@{\rmfamily}ll@{}l}
%\bfseries Page & \multicolumn{2}{c}{\bfseries\rmfamily Command}\\
%1 & \cmdname{glossary}\{&name=diagonal matrix,\\
%  &                     &description=Matrix whose only non-zero\\
%  &                     &entries are along the leading diagonal\}\\
%2 & \cmdname{glossary}\{&name=identity matrix,\\
%  &                     &description=Diagonal matrix with 1s along the \\
%  &                     &leading diagonal\}\\
%4 & \cmdname{glossary}\{&name=singular matrix,\\
%  &                     &description=Matrix with zero determinant\}
%\end{tabular}
%\end{center}
%
%\noindent Variations:
%\begin{enumerate}
%\item If \pkgopt[list]{style} is chosen, the glossary will look like:
%\begin{description}
%\item[diagonal matrix] Matrix whose only non-zero entries are along the leading
% diagonal, 1
%\item[identity matrix] Diagonal matrix with 1s along the leading diagonal, 2
%\item[singular matrix] Matrix with zero determinant, 4
%\end{description}
%
%\item If \pkgopt[altlist]{style} is chosen, the glossary will look like:
%\begin{description}
%\item[diagonal matrix]\mbox{}\par Matrix whose only non-zero entries are along the leading
% diagonal, 1
%\item[identity matrix]\mbox{}\par Diagonal matrix with 1s along the leading diagonal, 2
%\item[singular matrix]\mbox{}\par Matrix with zero determinant, 4
%\end{description}
%
%\item If \pkgopt[list]{style},\pkgopt[none]{number}%
% is chosen, the glossary will look like:
%\begin{description}
%\item[diagonal matrix] Matrix whose only non-zero entries are along the leading
% diagonal
%\item[identity matrix] Diagonal matrix with 1s along the leading diagonal
%\item[singular matrix] Matrix with zero determinant
%\end{description}
%
%\item If \pkgopt[long]{style},\pkgopt[none]{border},%
%\pkgopt[none]{header},\pkgopt[page]{number} 
%is chosen (default), the glossary will look like:\\[10pt]
%\newlength{\descriptionwidth}\setlength{\descriptionwidth}{0.6\textwidth}
%\begin{tabular}{@{\hspace{\tabcolsep}\bfseries}lp{\descriptionwidth}} &
%\\ diagonal matrix & Matrix whose only non-zero entries are along the leading
% diagonal, 1
%\\ & 
%\\identity matrix & Diagonal matrix with 1s along the leading diagonal, 2
%\\ & 
%\\ singular matrix & Matrix with zero determinant, 4
%\end{tabular}
%
%\item If \pkgopt[long]{style},\pkgopt[plain]{border},%
%\pkgopt[none]{header} is chosen,
%the glossary will look like:
%\\[10pt]
%\begin{tabular}{|@{\hspace{\tabcolsep}\bfseries}lp{\descriptionwidth}|}\hline &
%\\ diagonal matrix & Matrix whose only non-zero entries are along the leading
% diagonal, 1
%\\ & 
%\\identity matrix & Diagonal matrix with 1s along the leading diagonal, 2
%\\ & 
%\\ singular matrix & Matrix with zero determinant, 4
%\\ & \\\hline
%\end{tabular}
%
%\item If \pkgopt[long]{style},\pkgopt[plain]{border},%
%\pkgopt[plain]{header} is
%chosen, the glossary will look like:
%\\[10pt]
%\begin{tabular}{|@{\hspace{\tabcolsep}\bfseries}lp{\descriptionwidth}|}\hline
%\bfseries Notation & \bfseries Description\\\hline\hline &
%\\ diagonal matrix & Matrix whose only non-zero entries are along the leading
% diagonal, 1
%\\ & 
%\\identity matrix & Diagonal matrix with 1s along the leading diagonal, 2
%\\ & 
%\\ singular matrix & Matrix with zero determinant, 4
%\\ & \\\hline
%\end{tabular}
%
%\item If \pkgopt[long]{style},\pkgopt[none]{border},%
%\pkgopt[plain]{header},\pkgopt[3]{cols} is chosen, the
%glossary will look like:
%\\[10pt]
%\begin{tabular}{@{\hspace{\tabcolsep}\bfseries}lp{\descriptionwidth}l} 
%\bfseries Notation & \bfseries Description & \\ &
%\\ diagonal matrix & Matrix whose only non-zero entries are along the leading
% diagonal & 1
%\\ & 
%\\identity matrix & Diagonal matrix with 1s along the leading diagonal & 2
%\\ & 
%\\ singular matrix & Matrix with zero determinant & 4
%\\ & \\
%\end{tabular}
%\end{enumerate}
%
%
%\section{Defining New Glossary Types}
%\label{sec:newglostype}
%
%A new type of glossary can be defined using the command:\DescribeMacro{\newglossarytype}\\[5pt]
%\cmdname{newglossarytype}\verb/[/\meta{log-ext}\verb"]{"\meta{name}\verb'}{'\meta{out-ext}\verb+}{+\meta{in-ext}\verb!}[!\meta{style list}\verb-]-\\[5pt]
%For example, suppose you want your document to have a separate 
%index of terms and index of notation,
%you could use \icmdname{makeglossary}, \icmdname{glossary},
%\icmdname{xglossary} and \icmdname{printglossary} for the first 
%glossary, and define a new type of glossary called say, 
%\texttt{notation}, using
%\begin{verbatim}
%\newglossarytype[nlg]{notation}{not}{ntn}
%\end{verbatim}
%which will create the analogous commands:
%\cmdname{makenotation}, \cmdname{notation}, \cmdname{xnotation} 
%and \cmdname{printnotation} which can be used for the second 
%glossary. 
%
%\changes{2.3}{2005 Nov 18}{Added extra optional argument to 'newglosarytype}
%As from version 2.3, \cmdname{newglossarytype} now has an
%additional optional argument \meta{style list}. This should
%be a comma separated list of \meta{key}=\meta{value} pairs
%that can be used to specify the style of the new glossary.
%If omitted, the new glossary will have the same format
%as the main glossary. The following options are available:
%\texttt{number}, \texttt{style}, \texttt{header}, \texttt{border} and
%\texttt{cols}. These can take the same values as those
%given in the package options (described in section~\ref{sec:options}).
%
%The command \cmdname{newglossarytype} should only occur in the 
%preamble.  The new commands
% \cmdname{make}\meta{name}, \verb'\'\meta{name},
%\verb'\x'\meta{name} and \cmdname{print}\meta{name} all have the 
%same format as their ``glossary'' counter-parts.
%
%The glossary information will be saved to a file
%with the extension given by \meta{out-ext} (analogous to
%\filetype{glo}), which can then be passed to \appname{makeindex}
%either directly or via \appname{makeglos.pl},
%and the file to be read in (i.e.\ the file created by 
%\appname{makeindex}) will have the extension \meta{in-ext} 
%(analogous to \filetype{gls}). 
%
%The optional argument \meta{log-ext} indicates
%the extension for the \appname{makeindex} log file, if omitted the
%extension \filetype{glg} is used. This is not used by \LaTeX,
%however \appname{makeglos.pl} reads in this information from
%the \LaTeX\ auxiliary file and passes it to \appname{makeindex}.\changes{2.22}{2005 Sept 12}{changed makeglos to read information in from .aux instead of .log file}
%
%For the above \texttt{notation} 
%example, if your document is called, say, \texttt{mydoc.tex},
% you will need to do the following:
%\begin{verbatim}
%latex mydoc
%makeglos.pl mydoc
%latex mydoc
%\end{verbatim}
%(You may need to do an extra \verb"latex mydoc" to get 
%cross-references up-to-date.)  Note that if you don't specify the
%file extension when using \appname{makeglos.pl}, it will 
%check the transcript file from the \LaTeX\ run to determine
%all the glossary types, so, for this example,
%\begin{verbatim}
%makeglos.pl mydoc
%\end{verbatim}
%is equivalent to:
%\begin{verbatim}
%makeglos.pl mydoc.glo
%makeglos.pl mydoc.not
%\end{verbatim}
%since \appname{makeglos.pl} has read in the information
%for the \texttt{notation} glossary type from the file
%\texttt{mydoc.log}.
%
%If you don't have Perl installed
%on your system, or for any other reason are unable to use
%\appname{makeglos.pl}, you can call \appname{makeindex}
%explicitly:
%\begin{verbatim}
%latex mydoc
%makeindex -s mydoc.ist -t mydoc.glg -o mydoc.gls mydoc.glo
%makeindex -s mydoc.ist -t mydoc.nlg -o mydoc.ntn mydoc.not
%latex mydoc
%\end{verbatim}
%
%Note that you can use the command 
%\icmdname{printglossary}\texttt[\meta{name}\texttt]
%instead of \verb'\print'\meta{name}.
%These two commands have the same effect when using \LaTeX,
%however, they have a slightly different effect when 
%using \LaTeX2HTML (see \autoref{sec:l2h}).
%
%If the command \verb'\'\meta{glossary-type}\verb"name"
%is defined, (e.g.\ \verb'\notationname' in the above example)
%this will be used as the title for the specified
%glossary. If this command is not defined, \icmdname{glossaryname}
%will be used instead.
%If the command \verb'\short'\meta{glossary-type}\verb"name"
%is defined, (e.g.\ \cmdname{shortnotationname} in the above
%example) this will be used for the table of contents
%entry, otherwise \verb'\'\meta{glossary-type}\verb"name" will
%be used instead.
%For example:
%\begin{verbatim}
%\newglossarytype[nlg]{notation}{not}{ntn}
%\newcommand{\notationname}{Index of Notation}
%\newcommand{\shortnotationname}{Notation}
%\end{verbatim}
%
%\section{Acronyms}
%
%\changes{2.0}{2004 September 21}{Acronyms}
%The \styname{glossary} package provides the command\DescribeMacro{\newacronym}:\\[5pt]
%\begin{ttfamily}
%\cmdname{newacronym}[\textrm{\meta{cmd-name}}]\{\textrm{\meta{acronym}}\}\{\textrm{\meta{long}}\}\{\textrm{\meta{glossary entry}}\}
%\end{ttfamily}\\[5pt]
%which can be used to define acronyms.  The argument \meta{long} 
%is the full name, the argument \meta{acronym} is the acronym for 
%\meta{long} and \meta{glossary entry} is the glossary information
%in the form used by the \icmdname{glossary} command.  If the 
%optional argument \meta{cmd-name} is missing, 
%\cmdname{newacronym} will create a command called 
%\verb!\!\meta{acronym}, otherwise it will create a command 
%called \verb'\'\meta{cmd-name} (henceforth denoted \cmdname{}\meta{acr-name}).
%This command can then be used throughout the text.  The first
%instance of this command is equivalent to:\\[10pt]
%\meta{long} \texttt(\icmdname{xacronym}\verb"{"\gloskey{name}\texttt{=}\meta{long} \texttt(\meta{acronym}\texttt{),}\meta{glossary entry}\verb'}{'\meta{acronym}\verb/}/\texttt)\\[10pt]
%subsequent instances will be equivalent to:\\[10pt]
%\icmdname{xacronym}\verb"{"\gloskey{name}\texttt{=}\meta{long} \texttt(\meta{acronym}\texttt{),}\meta{glossary entry}\verb'}{'\meta{acronym}\verb/}/\\[10pt]
%The command \cmdname{}\meta{acr-name} also has a starred
%version, which will make the first letter of \meta{long}
%uppercase (for use at the start of a sentence).
%
%Note that if you want to change the format of the acronym,
%for example, if you want the acronym to appear in small caps,
%you will need to not only use the optional argument, but you
%will also need to use the \gloskey{sort} key, otherwise you
%will get an error. For example:
%\begin{verbatim}
%\newacronym[SVM]{\textsc{svm}}{Support Vector Machine}%
%{description=Statistical pattern recognition 
%technique,sort=svm}
%\end{verbatim}
%
%If the package option \pkgopt{acronym} is not set (default)
%\icmdname{xacronym}, is a synonym for \icmdname{xglossary}, and
%the acronyms will appear in the main glossary (remember to
%specify \cmdname{makeglossary} and \cmdname{printglossary}).
%If the package option \pkgopt[true]{acronym} is specified, a 
%new glossary type called \texttt{acronym} will be defined as:
%\begin{verbatim}
%\newglossarytype[alg]{acronym}{acr}{acn}
%\providecommand{\acronymname}{List of Acronyms}
%\end{verbatim}
%You will then need to use the commands \icmdname{makeacronym}
%and \icmdname{printacronym} to make the list of acronyms appear.
%You will also need to run the \filetype{acr} file through 
%\appname{makeindex} (or \appname{makeglos.pl}).  For example:
%\begin{verbatim}
%makeindex -s mydoc.ist -t mydoc.alg -o mydoc.acn mydoc.acr
%\end{verbatim}
%alternatively:
%\begin{verbatim}
%makeglos.pl mydoc
%\end{verbatim}
%Note that the package option \pkgopt[true]{acronym} is only
%appropriate if you want both a glossary and a separate list of
%acronyms. If you do not write in English, you can set up your 
%own language definition
%for \cmdname{acronymname} in the configuration file 
%\texttt{glossary}\filetype{cfg}. For example:
%\begin{verbatim}
%\newcommand{\acronymname}{Akronyme}
%\end{verbatim}
%(If \texttt{glossary.cfg} does not exist, create a new file, add the
%appropriate definition of \cmdname{acronymname}, and save it to the 
%same directory as \texttt{glossary.sty}.)
%
%\changes{2.1}{2004 October 25}{name field can be omitted in 
%\texttt{'newacronym}}
%The \gloskey{name} key does not need to appear in \meta{glossary
%entry}, as it is constructed from \meta{long} and
%\meta{acronym}.  By default this will be in the form:
%\meta{long} (\meta{acronym}), however the format can be 
%overridden using the 
%command:\DescribeMacro{\setacronymnamefmt}\\[10pt]
%\cmdname{setacronymnamefmt}\{\meta{format}\}\\[10pt]
%Within \meta{format} the following commands may 
%be used to represent \meta{long} and \meta{acronym}: 
%\DescribeMacro{\glolong}\icmdname{glolong} and 
%\DescribeMacro{\gloshort}\icmdname{gloshort}.  For example, 
%suppose you just want the acronym to appear in the glossary entry,
%and not its full length name, then you would need to do:
%\begin{verbatim}
%\setacronymnamefmt{\gloshort}
%\end{verbatim}
%
%\changes{2.32}{2006 January 5}{added \texttt{'setacronymdescfmt}}
%As from version 2.32, you can also modify the way the description
%key is formatted for acronyms using\DescribeMacro{\setacronymdescfmt}:\\[10pt]
%\cmdname{setacronymdescfmt}\{\meta{format}\}\\[10pt]
%Within \meta{format} you may use the commands \icmdname{glolong}
%and \icmdname{gloshort} (as above), and you can also use
%the command \icmdname{glodesc} which is the description as
%specified by the \gloskey{description} key in 
%\icmdname{newacronym}. This means that if you are using
%a tabular style glossary, you can have the abbreviated
%form in one column and the long form in the second column
%with the description. For example, the following:
%\begin{verbatim}
%\setacronymnamefmt{\gloshort}
%\setacronymdescfmt{\glolong: \glodesc}
%\newacronym{svm}{support vector machine}{description=Statistical
%pattern recognition technique}
%\end{verbatim}
%will generate a glossary entry of the form:
%\begin{verbatim}
%\glossary{name=svm,description=support vector machine: Statistical
%pattern recognition technique}
%\end{verbatim}
%Note that if you omit \icmdname{glodesc} from 
%\cmdname{setacronymdescfmt} the description specified 
%in \cmdname{newacronym} will be ignored. So 
%\begin{verbatim}
%\setacronymnamefmt{\gloshort}
%\setacronymdescfmt{\glolong}
%\newacronym{svm}{support vector machine}{description=Statistical
%pattern recognition technique}
%\end{verbatim}
%will generate a glossary entry of the form:
%\begin{verbatim}
%\glossary{name=svm,description=support vector machine}
%\end{verbatim}
%
%You will need to specify the \gloskey{name} key explicitly if 
%the name contains a \appname{makeindex} special character.
%For example:
%\begin{verbatim}
%\newacronym{RNA}{Ribonukleins\"aure}{name={Ribonukleins\""aure (RNA)}}
%\end{verbatim}
%Note that this will override any formatting specified by 
%\icmdname{setacronymnamefmt}.
%
%Given an acronym named \meta{acr-name} (the command name 
%associated with the acronym as defined in 
%\cmdname{newacronym} without the preceding backslash),
%the following commands are also available:
%
%\vspace{10pt}
%\changes{2.11}{2004 October 25}{\texttt{'useacronym}}
%\changes{2.18}{2005 July 5}{Fixed bug in 'useacronym}
%\changes{2.26}{2005 November 17}{Fixed bug in 'useacronym}
%\noindent
%\cmdname{useacronym}\verb"["\meta{insert}\verb']{'\meta{acr-name}\verb!}!\DescribeMacro{\useacronym}\\[5pt]
%This command can be used instead of \cmdname{}\meta{acr-name}.
%\cmdname{useacronym} also has a starred version equivalent to 
%\cmdname{}\meta{acr-name}\texttt{*}.
%The optional argument \meta{insert} allows you to insert text 
%after \meta{long}, if this is the first occurrence of the 
%acronym, or after the acronym on subsequent occurrences.
%
%\vspace{10pt}
%\changes{2.14}{2005 May 28}{'resetacronym added}\noindent
%\cmdname{resetacronym}\verb'{'\meta{acr-name}\verb"}"
%\DescribeMacro{\resetacronym}\\[10pt]
%This command will cause the next use of \cmdname{}\meta{acr-name}
%to produce the long version. To reset all acronyms
%do \cmdname{resetallacronyms}.\DescribeMacro{\resetallacronyms}
%\changes{2.21}{2005 July 27}{'resetallacronyms added}
%
%\vspace{10pt}
%\changes{2.31}{2005 December 5}{'unsetacronym added}\noindent
%\cmdname{unsetacronym}\verb'{'\meta{acr-name}\verb"}"
%\DescribeMacro{\unsetacronym}\\[10pt]
%This command will cause all subsequent uses of 
%\cmdname{}\meta{acr-name} to produce the short version. 
%To unset all acronyms
%do \cmdname{unsetallacronyms}.\DescribeMacro{\unsetallacronyms}
%\changes{2.31}{2005 December 5}{'unsetallacronyms added}
%
%\vspace{10pt}
%\changes{2.14}{2005 May 28}{'ifacronymfirstuse added}\noindent
%\cmdname{ifacronymfirstuse}%
%\verb'{'\meta{acr-name}%
%\verb'}{'\meta{true text}\verb"}{"\meta{false text}\verb!}!
%\DescribeMacro{\ifacronymfirstuse}\\[10pt]
%This will test if the acronym has been used yet.  If it has been
%used, \meta{true text} will be implemented, otherwise
%\meta{false text} will be implemented.
%
%The long and short forms of an acronym can be produced explicitly 
%without a corresponding glossary entry, using the commands:\\[10pt]
%\changes{2.19}{2005 July 8}{'acrln added}%
%\cmdname{acrln}\verb'{'\meta{acr-name}\verb/}/\DescribeMacro{\acrln}\\
%\cmdname{acrsh}\verb'{'\meta{acr-name}\verb/}/\DescribeMacro{\acrsh}
%\changes{2.19}{2005 July 8}{'acrsh added}\\[10pt]
%Or, alternatively:\\[10pt]
%\cmdname{}\meta{acr-name}\texttt{long}\\
%\cmdname{}\meta{acr-name}\texttt{short}\\[10pt]
%The first two commands (\cmdname{acrln} and \cmdname{acrsh})
%have a starred form that makes the first letter uppercase.
%The other two commands, simply contain \meta{long} and
%\meta{acronym}.
%
%Note that since these four commands do not generate glossary 
%entries they will therefore not contain any hyperlinks, even if 
%you have specified the \pkgopt{hyper} package option. They are 
%provided for use in situations where the associated glossary 
%command may cause problems (e.g.\ in a sectioning command.)
%
%Note that, as with all \LaTeX\ commands, spaces following
%command names are ignored so if, for example, you defined 
%a new acronym called, say, SVM, then the command \verb/\SVM/ will
%ignore any spaces following it. To force a space, you 
%can either place an empty set of braces after the command
%name (e.g.\ \verb/\SVM{}/) or use 
%\cmdname{\textvisiblespace} i.e.\ a backslash followed by 
%a space (e.g.\ \verb/\SVM\ /). Alternatively, as from 
%version 2.22, if you load the \styname{xspace} package 
%before loading the \styname{glossary} package, spaces will
%be put in automatically using \icmdname{xspace}.
%\changes{2.22}{2005 Sept 16}{Added provision for 'xspace}
%\changes{2.23}{2005 Sept 17}{Fixed minor bug with hyperlinks and 'glsxspace}
%\changes{2.28}{2005 July 9}{Fixed erroneous spaces occuring while
%using xspace}
%
%\DescribeMacro{\acronymfont}
%\changes{2.22}{2005 Sept 12}{Added 'acronymfont}%
%If you want the acronym to appear in a particular font,
%for example, small caps, you can redefine the command
%\cmdname{acronymfont}. For example:
%\begin{verbatim}
%\renewcommand{\acronymfont}[1]{\textsc{#1}}
%\end{verbatim}
%The default definition of \cmdname{acronymfont} is:
%\begin{verbatim}
%\newcommand{\acronymfont}[1]{#1}
%\end{verbatim}
%
%\subsection{Examples}
%
%\begin{verbatim}
%\newacronym{SVM}{Support Vector Machine}{description=Statistical 
%pattern recognition technique}
%\end{verbatim}
%This will define the command \cmdname{SVM}.  The first time this 
%command is used will display the text: Support Vector Machine 
%(SVM).  Subsequent use will simply display: SVM.  The next 
%example uses the optional argument \meta{cmd-name} since the 
%acronym contains a non-alphabetical character:
%\begin{verbatim}
%\newacronym[KSVM]{K-SVM}{Kernel Support Vector 
%Machine}{description=Statistical pattern recognition 
%technique using the ``kernel trick''}
%\end{verbatim}
%This will define the command \cmdname{KSVM}.  The first time 
%this command is used will display the text: Kernel Support Vector
%Machine (K-SVM).  Subsequent use will simply display: K-SVM.
%
%To test whether or not an acronym has been used:
%\begin{verbatim}
%\ifacronymfirstuse{SVM}{a}{an} \SVM\ is \ldots
%\end{verbatim}
%If the acronym has not been used, the following text will
%be produced:\\[10pt]
%a Support Vector Machine is \ldots\\[10pt]
%otherwise it will produce:\\[10pt]
%an SVM is \ldots\\[10pt]
%To expand the acronym a second time:
%\begin{verbatim}
%\chapter{An overview of the \protect\SVM}
%\resetacronym{SVM}
%The \SVM\ \ldots
%\end{verbatim}
%Note the use of \cmdname{protect} (see 
%note~\ref{itm:fragile} on page~\pageref{itm:fragile}.) In fact, in this situation
%it would be better to do:
%\begin{verbatim}
%\chapter[An overview of the \SVMlong]{An overview of the \protect\SVM}
%\resetacronym{SVM}
%The \SVM\ \ldots
%\end{verbatim}
%
%Now suppose you want the text: support vector machine, 
%instead of Support Vector Machine (i.e.\ you don't like the 
%uppercase letters).  You can define the acronym as follows:
%\begin{verbatim}
%\newacronym{SVM}{support vector machine}{description=Statistical 
%pattern recognition technique}
%\end{verbatim}
%however, if the command \cmdname{SVM} occurs at the start of the 
%sentence, you would clearly want the first letter as an
%uppercase letter.  This can be done using \cmdname{SVM*} instead 
%of \cmdname{SVM}.  For example:
%\begin{verbatim}
%\SVM*\ techniques are widely used \ldots
%\end{verbatim}
%This will then come out as: Support vector machine (SVM) 
%techniques are widely used \ldots (Assuming this is the first 
%use of either \cmdname{SVM} or \cmdname{SVM*}.)
%
%Alternatively, \icmdname{useacronym}\verb'{SVM}' can be used instead of 
%\cmdname{SVM}. For example:
%\begin{verbatim}
%\useacronym*[s]{SVM} are widely used in the area of pattern 
%recognition.
%\end{verbatim}
%If this is the first use of the acronym SVM, it will produce the 
%following text:\\[10pt]
%Support vector machines (SVM) are widely used in the area of 
%pattern recognition.\\[10pt]
%If this is not the first use of this acronym, it will produce the 
%following text:\\[10pt]
%SVMs are widely used in the area of pattern recognition.
%
%\section{Customizing the Glossary}
%The \styname{glossary} package provides commands which can be redefined to customize the
%glossary.  The following name commands are defined by this package:
%\begin{center}\DescribeMacro{\glossaryname}\DescribeMacro{\entryname}\DescribeMacro{\descriptionname}\relax
%\begin{tabular}{ll}
%\bfseries Command & \bfseries Default Value\\
%\cmdname{glossaryname} & Glossary\\
%\cmdname{shortglossaryname} & \cmdname{glossaryname}\\
%\cmdname{entryname} & Notation\\
%\cmdname{descriptionname} & Description
%\end{tabular}
%\end{center}
%The commands \cmdname{entryname} and \cmdname{descriptionname}
%are put in the first two columns of the header row if you
%are using one of the tabular glossary styles together with a 
%header row (as specified by the \pkgopt[true]{header} package option).
%If you are using \pkgopt[3]{cols}, the command 
%\cmdname{glspageheader}\DescribeMacro{\glspageheader}\ will be
%put in the third column of the header row. By default, this command
%does nothing.\changes{2.4}{2006 July 20}{'glspageheader added}
%
%\changes{2.2}{2005 July 15}{'glossaryname now defined using 'providecommand instead of 'newcommand}
% \changes{2.15}{2005 June 5}{'shortglossaryname}
%\changes{2.16}{2005 June 8}{fixed bug preventing changes
%to 'glossaryname and 'shortglossaryname}
%\DescribeMacro{\shortglossaryname}
%The command \cmdname{shortglossaryname} is used for the
%page headers and table of contents entry.
% \changes{1.1}{2004 August 14}{'glossarypreamble}%
% \changes{1.1}{2004 August 14}{'glossarypostamble}%
%Any text required before or after the glossary can be added
%by redefining the commands \DescribeMacro{\glossarypreamble}\cmdname{glossarypreamble}
%and \DescribeMacro{\glossarypostamble}\cmdname{glossarypostamble}.
%For example.
%\begin{verbatim}
%\renewcommand{\glossarypreamble}{Page numbers in 
%italic indicate the main definition\par}
%\end{verbatim}
%By default, \cmdname{glossarypreamble} and \cmdname{glossarypostamble} do nothing.
%
%\changes{2.3}{2005 Nov 18}{'glsbeforenum}%
%\changes{2.3}{2005 Nov 18}{'glsafternum}%
%Any text required before or after the list of page numbers
%are specified by the commands \cmdname{glsbeforenum}
%\DescribeMacro{\glsbeforenum}
%and \cmdname{glsafternum}\DescribeMacro{\glsafternum}.
%By default, these commands do nothing, any redefinition
%of these commands should come somewhere before the
%relevant \cmdname{printglossary} command.  For example:
%\begin{verbatim}
%\printglossary
%\renewcommand{\glsbeforenum}{(}
%\renewcommand{\glsafternum}{)}
%\printnotation
%\end{verbatim}
%This will put the page number list in brackets for the
%second glossary, but not the first.
%
%Individual glossaries can have their styles changed either
%by setting the style in the final optional argument
%to \icmdname{newglossarystyle} (see 
%\autoref{sec:newglostype}) or using the command\DescribeMacro{setglossarystyle}:\\[10pt]
%\cmdname{setglossarystyle}[\meta{type}]\{\meta{style list}\}\\[10pt]
%For example:
%\begin{verbatim}
%\setglossarystyle[acronym]{style=long,border=true,cols=2}
%\end{verbatim}
%If \meta{type} is omitted, the change is applied to the main
%glossary.
%
%\changes{1.1}{2004 August 14}{\relax Increased User Flexibility}%
%\changes{2.14}{2005 May 29}{'setglossary added}
%\DescribeMacro{\setglossary}
%The command \cmdname{setglossary}\verb'{'\meta{key-val list}\verb"}"
%can be used to modify some of the glossary settings. The argument
%\meta{key-val list} is a comma-separated list of
%\meta{key}=\meta{value} pairs.  Available keys are:
%\begin{description}
%\item[\setglos{type}] This is the glossary type.  
%If it is omitted, the standard glossary is assumed.
%
%\item[\setglos{glsnumformat}] 
%\changes{1.1}{2004 August 14}{\texttt{'glsnumformat}}%
%This is the name of the command, 
%\emph{without} the preceding backslash\footnote{Note, you should 
%no longer try redefining the command \cmdname{glsnumformat}, as 
%this now takes an optional argument, allowing for different 
%glossary types}, to format the
%entry numbers. For example, to make all the entry numbers italic,
%do:
%\begin{verbatim}
%\setglossary{glsnumformat=textit}
%\end{verbatim}
%To suppress numbering altogether, you can do:
%\begin{verbatim}
%\setglossary{glsnumformat=ignore}
%\end{verbatim}
%
%\item[\setglos{glodelim}] This 
%specifies what to do after the entry description and
%before the page numbers.  The default value is a comma, unless the \pkgopt[3]{cols} option is specified,
%in which case it has the value \verb"&", or if 
%\pkgopt[altlist]{style}, 
%in which case it is simply a space\footnote{This 
%is because the \texttt{altlist} style is intended for use with long descriptions that will look better ending with a 
% full stop which the user can add if desired.}.  If the package option \pkgopt[none]{number} is
%specified, \setglos{glodelim} will have an empty value (unless 
%\pkgopt[3]{cols} is specified,
%where, again, it will have the value \verb"&".)
%This setting corresponds to the \istkey{delim\_0} key in the
%\appname{makeindex} style file.
%
%Note that if you want a new line between the description
%and the list of page numbers you will need to use
%\cmdname{noexpand}. For example:
%\begin{verbatim}
%\setglossary{glodelim={\noexpand\newline}}
%\end{verbatim}
%
%\item[\setglos{delimN}]
%\changes{1.1}{2004 August 14}{\texttt{'delimN}}
%The delimiter to be inserted between two 
%page numbers for the same entry. (This corresponds to the 
%\istkey{delim\_n} key in the \appname{makeindex} style file.)
%By default, this has the value 
%\texttt{,\textvisiblespace} (comma followed by a space).  If the 
%package option \pkgopt[none]{number} is chosen, the value is set
%to empty.
%
%\item[\setglos{delimR}]
%\changes{1.1}{2004 August 14}{'delimR}
%The delimiter to be inserted between the starting and ending page
%number range for the same entry.  (This corresponds to the 
%\istkey{delim\_r} key in the \appname{makeindex} style file.)
%By default, this has the value \verb"--".  If the
%package option \pkgopt[none]{number} is chosen, the value is set 
%to empty.
%
%\item[\setglos{gloskip}]
%\changes{2.3}{2005 Nov 18}{'gloskip}
%This specifies what to do between groups.
%If \pkgopt[list]{style} or \pkgopt[altlist]{style} this has the
%value \cmdname{indexspace}, otherwise it creates a blank row
% in the \envname{longtable} or \envname{supertabular} environment.
%This command corresponds to the \istkey{group\_skip} key in
%the \appname{makeindex} style file.
%Note that as from version 2.3, you should no longer redefine
%the command \cmdname{gloskip}.
%
%\item[\setglos{delimT}]
%\changes{2.3}{2005 Nov 18}{'delimT}
%The text to be inserted after the list of
%page numbers for an entry. (This corresponds to the 
%\istkey{delim\_t} key in the \appname{makeindex} style file.)
%The default value depends on the glossary style. It does
%nothing for the list-type styles, and has the value
%\verb/\\/ for the tabular-type styles. Note that 
%\setglos{delimT} is separate from \cmdname{glsafternum}.
%
%For example, if you are using a 2 column tabular style,
%and you want a blank line after every entry (not just
%after every group) you can do the following:
%\begin{verbatim}
%\setglossary{delimT={\cr & \cr},gloskip={}}
%\end{verbatim}
%Note the use of \cmdname{cr} instead of \verb/\\/ and 
%\setglos{gloskip} is set to nothing otherwise there would be
%a double space between groups.
%\end{description}
%Note that:
%\begin{verbatim}
%\setglossary{glsnumformat=ignore}
%\end{verbatim}
%is equivalent to 
%\begin{verbatim}
%\setglossary{glsnumformat=ignore,delimN={},delimR={}}
%\end{verbatim}
%
%As from version 2.4\changes{2.4}{2006 July 20}{Added facility to insert text between groups}, 
%you can insert text between groups by redefining the
%commands \cmdname{glogroupSymbols}, 
%\cmdname{glogroupNumbers}, \cmdname{glogroupA} \ldots\
%\cmdname{glogroupZ}. For example, if you are using one
%of the list styles, the following will print the appropriate
%heading in bold, followed by a gap:
%\begin{verbatim}
%\renewcommand{\glogroupSymbols}{\textbf{Symbols}\indexspace}
%\renewcommand{\glogroupNumbers}{\textbf{Numbers}\indexspace}
%\renewcommand{\glogroupA}{\textbf{A}\indexspace}
%....% similar lines omitted
%\renewcommand{\glosgroupZ}{\textbf{Z}\indexspace}
%\end{verbatim}
%
%The start and end of the main body of the glossary is given by the commands:
%\cmdname{beforeglossary}\DescribeMacro{\beforeglossary}{} and
%\cmdname{afterglossary}\DescribeMacro{\afterglossary}.
%If the \pkgopt[list]{style} 
%or \pkgopt[altlist]{style} 
%package options are chosen these commands simply begin and end
%the \envname{description}
%environment, otherwise these commands begin and end the 
%\envname{longtable} or 
%\envname{supertabular} 
%environment with argument specified by 
%\cmdname{glossaryalignment}\footnote{This isn't quite true
%anymore, see the documented code for clarification}.\DescribeMacro{\glossaryalignment}
%
%\changes{2.1}{2004 October 25}{made glossary compatible with array package}
%\changes{2.3}{2005 Nov 18}{made glossary compatible with array package}
%The glossary package no longer conflicts with the \styname{array}
%package. Changes can now be made to \cmdname{glossaryalignment} 
%regardless of whether or not the \styname{array}
%package has been used.
%
%The command \cmdname{gloitem}\DescribeMacro{\gloitem}\ indicates
%what to do at the start of each glossary entry.
%This command takes one argument, which will be the text specified by the \gloskey{name} key
%in the \icmdname{glossary} command.  In the case of the 
%\pkgopt[list]{style} option, 
%\cmdname{gloitem}\verb"{"\meta{text}\verb'}'
%will do\\[5pt]
%\verb"\item["\meta{text}\verb']'\\[5pt]
%or if \pkgopt[altlist]{style}:\\[5pt]
%\verb"\item["\meta{text}\verb']\mbox{}\par'\\[5pt]
%otherwise it will do\\[5pt]
%\meta{text}\verb" &"\\[5pt]
%This command corresponds to the \istkey{item\_0} key in the
%\appname{makeindex} style file.
%
%If the glossary has a tabular style with a header row 
%(\pkgopt[true]{header} and either \pkgopt[long]{style} or 
%\pkgopt[super]{style}), then the header row for \pkgopt[2]{cols}
%will be given by:
%\begin{verbatim}
%\bfseries\entryname & \bfseries \descriptionname\\
%\end{verbatim}
%and the header row for \pkgopt[3]{cols} will be given by:
%\begin{verbatim}
%\bfseries\entryname & \bfseries\descriptionname & 
%\bfseries\glspageheader\\
%\end{verbatim}
%(It may also contain \cmdname{hline}\cmdname{hline} if the 
%\pkgopt{border} key is set.)
%
%If you want to override this, you need to define the command
%\cmdname{glossaryheader}\footnote{Note that as from version~2.4, 
%you must use \cmdname{newcommand} \emph{not} \cmdname{renewcommand}}%
%\DescribeMacro{\glossaryheader}.
%
%For example, if you are using a tabular style with \pkgopt[2]{cols}, 
%and you want the \icmdname{descriptionname} to be centred, you could 
%do:
%\begin{verbatim}
%\newcommand{\glossaryheader}{\bfseries\entryname & 
% \hfil\bfseries\descriptionname\\}
%\end{verbatim}
%
%If you want an extra row below the header row, you can define
%the command\cmdname{glossarysubheader}\DescribeMacro{\glossarysubheader}
%\changes{2.4}{2006 July 20}{provision for 'glossarysubheader added}
%For example, if you are using \pkgopt[3]{cols}, and you want an
%extra row after the header row, you can do:
%\begin{verbatim}
%\newcommand{\glossarysubheader}{ & & \\}
%\end{verbatim}
%
%The command \cmdname{glosstail}\DescribeMacro{\glosstail}\ indicates what to do at the end of
%the \envname{longtable} or \envname{supertabular} environment.
%
%The width of the second column for the tabular-type styles is given by the length
%\cmdname{descriptionwidth}\DescribeMacro{\descriptionwidth}.  This value can be changed using
%the \cmdname{setlength} command (the default value is \verb"0.6\linewidth").
%
%\section{Sample Documents}
%This package comes with the following sample documents:
%\begin{itemize}
%\item \texttt{sampleSec.tex} --- This document uses the options: 
%\pkgopt[altlist]{style}, \pkgopt{toc} and
%\pkgopt[section]{number}.  It also loads the
%\styname{hyperref} package before loading the 
%\styname{glossary} package, so the glossary has hyperlinks
%to the section numbers.  Experimenting with different package 
%options, will illustrate the different glossary styles.
%You will need to do:
%\begin{verbatim}
%pdflatex sampleSec
%makeglos.pl sampleSec
%pdflatex sampleSec
%pdflatex sampleSec
%\end{verbatim}
%If you don't want to use \appname{makeglos.pl}, you will need
%to do
%\begin{verbatim}
%makeindex -s sampleSec.ist -t sampleSec.glg -o sampleSec.gls sampleSec.glo
%\end{verbatim}
%
%\item \texttt{sampleNtn.tex} --- This has a glossary and defines
%a new glossary type called \texttt{notation}.  The glossary has
%associated page numbers, but the new glossary type doesn't.
%The two glossaries have different styles.
%You will need to do:
%\begin{verbatim}
%latex sampleNtn
%makeglos.pl sampleNtn
%latex sampleNtn
%latex sampleNtn
%\end{verbatim}
%If you don't want to use \appname{makeglos.pl}, you will need
%to do
%\begin{verbatim}
%makeindex -s sampleNtn.ist -t sampleNtn.glg -o sampleNtn.gls sampleNtn.glo
%makeindex -s sampleNtn.ist -t sampleNtn.nlg -o sampleNtn.ntn sampleNtn.not
%\end{verbatim}
%
%\item \texttt{sampleNtn2.tex} ---This is similar to 
%\texttt{sampleNtn.tex}, but uses \icmdname{storeglosentry}.
%
%\item \texttt{sampleEq.tex} --- This has a glossary where the
%numbers in the glossary refer to the equation number rather than
%the page number (achieved with the package option 
%\pkgopt[equation]{number}).  The \icmdname{entryname},
%\icmdname{descriptionname}, \icmdname{glossaryname} and
%\icmdname{glspageheader} are all redefined to customize the
%glossary. You will need to do:
%\begin{verbatim}
%latex sampleEq
%makeglos.pl sampleEq
%latex sampleEq
%\end{verbatim}
%If you don't want to use \appname{makeglos.pl}, you will need
%to do
%\begin{verbatim}
%makeindex -s sampleEq.ist -t sampleEq.glg -o sampleEq.gls sampleEq.glo
%\end{verbatim}
%
%\item \texttt{sampleEqPg.tex} --- This is a modified version of 
%\texttt{sampleEq.tex}.  This example has one glossary, where some
%of the entry numbers refer to the corresponding page number, and
%some of the entry numbers refer to the corresponding equation
%number.  You will need to do:
%\begin{verbatim}
%latex sampleEqPg
%makeglos.pl sampleEqPg
%latex sampleEqPg
%\end{verbatim}
%If you don't want to use \appname{makeglos.pl}, you will need
%to do
%\begin{verbatim}
%makeindex -s sampleEqPg.ist -t sampleEqPg.glg -o sampleEqPg.gls sampleEqPg.glo
%\end{verbatim}
%
%\item \texttt{sampleAcr.tex} --- This has a glossary containing
%acronyms.  It uses the style \pkgoptval{altlist}{style} as this is better
%suited to glossaries with long names.  It also uses the
%\styname{hyperref} package, so the page numbers in the
%glossary will automatically be hyperlinks, and the acronyms
%within the text will have hyperlinks to their corresponding entry
%in the glossary.  You will need to do:
%\begin{verbatim}
%pdflatex sampleAcr
%makeglos.pl sampleAcr
%pdflatex sampleAcr
%pdflatex sampleAcr
%\end{verbatim}
%If you don't want to use \appname{makeglos.pl}, you will need
%to do
%\begin{verbatim}
%makeindex -s sampleAcr.ist -t sampleAcr.glg -o sampleAcr.gls sampleAcr.glo
%\end{verbatim}
%
%
%\item \texttt{sample.tex} --- This has a glossary entry
%with two different definitions of the same name.
%If you just use \appname{makeindex}, the two entries
%will be treated separately, however, if you want them
%concatenated, you can use \appname{makeglos.pl} with
%the \texttt{-m} switch. You will need to do:
%\begin{verbatim}
%pdflatex sample
%makeglos.pl -m sample
%pdflatex sample
%pdflatex sample
%\end{verbatim} 
%(Depending on the configuration of your system, you
%may have to do \texttt{perl makeglos.pl} instead of
%just \appname{makeglos.pl})
%
%If you don't want to use \appname{makeglos.pl}, you will need
%to do
%\begin{verbatim}
%makeindex -s sample.ist -t sample.glg -o sample.gls sample.glo
%\end{verbatim}
%however, the entries with the same name but multiple descriptions
%will not be merged. You will also have to given them different sort
%keys otherwise you will get duplicate hyper targets.
%
%\item \texttt{sample4col.tex}---This illustrates how to 
%modify the glossary style so that it has 4 columns. You
%will need to do:
%\begin{verbatim}
%latex sample4col
%makeglos.pl sample4col
%latex sample4col
%\end{verbatim}
%
%\end{itemize}
%
%\section{LaTeX2HTML Style File}
%\label{sec:l2h}
%
%A \LaTeX2HTML\ Perl script, \texttt{glossary.}\filetype{perl}, is
%provided with this package for those wishing to use the
%glossary package with the \LaTeX2HTML translator.
%The file \texttt{glossary.}\filetype{perl} should be extracted
%along with \texttt{glossary.sty} when you run the
%installation script (\texttt{glossary.ins}) through \LaTeX. 
%
%\subsection{Limitations}
%
%\begin{itemize}
%\item The only package options supported are: 
%\pkgopt[altlist]{style}, \pkgopt[true]{hyper}, \pkgopt[true]{toc},
%\pkgopt[true]{acronym} and \pkgopt[false]{acronym}.
%
%\item If you have more than one glossary type, the 
%secondary glossaries will occur in the same segment
%as the primary glossary if you use the command
%\verb'\print'\meta{name} instead of 
%\verb'\printglossary['\meta{name}\verb"]", where
%\meta{name} is the name of the glossary type.
%
%\item The command \icmdname{setglossary} must be
%placed in the preamble to have an effect.
%
%\item The \icmdname{storeglosentry} commands must be in
%the document environment to have an effect. (They don't
%seem to work in the preamble, I don't know why.)
%
%\item If you place a \icmdname{glossary} command
%inside an environment not translated by \LaTeX2HTML
%(for example, inside a mathematics environment),
%it will not be entered into the glossary.
%
%\item The combinations \verb'""', \verb!"|!, \verb+"!+
%and \verb'"@' will be correctly translated, unless they
%occur within a maths environment.  This is because
%the maths environment is translated before being
%passed to \icmdname{glossary}.  You can overcome this
%by doing, e.g.:\\
%\cmdname{begin}\verb'{latexonly}'\\
%\verb'\glossary{name=$"|\mathcal{S}"|$,description=cardinality of set'\\
%\verb'$\mathcal{S}$,sort=cardinality}'\\
%\cmdname{end}\verb'{latexonly}'\\
%\cmdname{begin}\verb'{htmlonly}'\\
%\verb'\glossary{name=$|\mathcal{S}|$,description=cardinality of set'\\
%\verb'$\mathcal{S}$,sort=cardinality}'\\
%\cmdname{end}\verb'{htmlonly}'
%
%Alternative, you can use \cmdname{mid} instead:
%\begin{verbatim}
%\glossary{name=$\mid\mathcal{S}\mid$,description=cardinality of
%set $\mathcal{S}$,sort=cardinality}
%\end{verbatim}
%
%\item Glossary items with the same names but different
%definitions will not be merged.
%
%\item The configuration file \texttt{glossary.cfg} is ignored.
%
%\end{itemize}
%
%
%\section{Troubleshooting}
%\label{sec:trouble}
%
%This is a list of common problems, for a more up-to-date FAQ, see
%\url{http://theoval.cmp.uea.ac.uk/~nlct/packages/faq/}.
%
%\begin{enumerate}
%\item My glossary hasn't appeared.
%
%Check the following:
%\begin{itemize}
%\item Have you included the command \icmdname{makeglossary}
%in the preamble?
%
%\item Have you put the command \icmdname{printglossary} where
%you want the glossary to appear?
%
%\item Have you used \appname{makeglos.pl} or \appname{makeindex},
%and if you did, did it successfully create the \filetype{gls}
%file? (Check the transcript \filetype{glg} file.)
%
%\begin{itemize}
%\item If you used \appname{makeindex} directly, did you specify 
%the \filetype{ist} file created by \icmdname{makeglossary},
%and did you remember to specify the output file with the extension
%\filetype{gls}?
%
%\item When \appname{makeindex} scans the \filetype{ist} file, 
%it should generate the message:
%\begin{verbatim}
%9 attributes redefined, 0 ignored
%\end{verbatim}
%If you have a number other than 0 ignored, then there is something
%wrong with the \filetype{ist} file. Some packages can cause 
%problems with the creation of this file, see 
%item~\ref{itm:ngerman} below.
%\end{itemize}
%
%\item Have you remembered to \LaTeX\ your document again
%after using \appname{makeglos.pl} or \appname{makeindex}?
%
%\item Have you used \icmdname{glossary} or \icmdname{xglossary}?
%
%\item If you have used \icmdname{storeglosentry}, have you also
%used \icmdname{useglosentry}, \icmdname{useGlosentry} or
%\icmdname{gls}?
%\end{itemize}
%
%If you have defined a new glossary type, have you checked
%all the analogous commands to the above?
%
%\item My list of acronyms hasn't appeared.
%
%Have you used the \pkgopt[true]{acronym} package option? If no,
%check the answers to the previous item, if yes, make sure
%you have used \icmdname{makeacronym} and \icmdname{printacronym}.
%Have you used any of the acronyms you have defined? Remember
%that \cmdname{acrsh}, \cmdname{acrln}, 
%\cmdname{}\meta{acr-name}\texttt{short} and 
%\cmdname{}\meta{acr-name}\texttt{long} don't generate entries
%in the list of acronyms, where \cmdname{}\meta{acr-name} is the 
%name of an acronym command.
%
%\item My acronym has been expanded twice.
%
%By default, if any of your acronym commands occur within a
%group (this includes environments which form implicit grouping)
%the effect will be local to that group. You can either unset
%the acronym outside the group, or use the \pkgopt{global}
%package option.
%
%\item I get an error when using the command 
%\icmdname{saveglosentry}.
%
%Don't use this command it's obsolete, use 
%\icmdname{storeglosentry} instead.
%
%\item One of more of my glossary entries hasn't appeared.
%
%Check the following
%\begin{itemize}
%\item If you defined the entry using \icmdname{storeglosentry}
%have you used either \icmdname{useglosentry},
%\icmdname{useGlosentry} or \icmdname{gls}?
%
%\item Have you remembered to \icmdname{protect} commands
%such as \cmdname{mathcal} within \icmdname{storeglosentry}?
%
%\item Have you used the characters \texttt{@} \texttt{!}
%\texttt{\textbar} \verb'"'? If so, have you preceded them
%with a double quote character?
%\end{itemize}
%
%Check the \appname{makeindex} log file to see if there are
%any error messages.
%
%\item My glossary has duplicate entries on separate lines.
%
%\LaTeX\ treats multiple spaces equivalent to a single space, but \appname{makeindex}
%takes spaces into account when determining whether two entries are identical.
%For example:
%\begin{verbatim*}
%\glossary{name=Identity matrix,
%description=diagonal matrix with 1's along the diagonal}
%\end{verbatim*}
%and
%\begin{verbatim*}
%\glossary{name=Identity  matrix,
%description=diagonal matrix with 1's along the diagonal}
%\end{verbatim*}
%will be treated as different entries by \appname{makeindex}, 
%because the first has only one space
%between `Identity' and `matrix' and the second has two. 
%The easiest way to ensure consistency is to use 
%\icmdname{storeglosentry} together with \icmdname{useglosentry},
%\icmdname{useGlosentry} or \icmdname{gls}.
%
%\item I had an error, fixed it, but I keep getting the same error message.
%
%Suppose you've made an error in the \icmdname{glossary} command. For example:
%\begin{verbatim}
%\glossary{name=Java,description=A programming language,format=texbf}
%\end{verbatim}
%In this case \texttt{textbf} has been mis-spelt.  This error will be copied to the \filetype{glo} file,
%which in turn will be copied to the \filetype{gls} file by 
%\appname{makeindex}.  A subsequent run of \LaTeX\ will
%read this error in.  If you fix the error in your main document, the error will still be read in from
%the \filetype{gls} file.  The best thing to do is to delete the 
%\filetype{gls} file, and try again.
%
%\item My glossary has ended up wider than my page.
%
%This may occur if you have long entry names, and you are using
%either the \pkgopt[long]{style} or \pkgopt[super]{style}
%options.  The width of the description column is proportional to 
%the line width (in fact, it's \verb"0.6\linewidth")
%but the first column is as wide as the widest entry name.  You
%can either redefine \icmdname{glossaryalignment} to change the
%column specifications, or use one of the list-type styles.
%
%\item The page numbers in my glossary don't match up with the actual page numbers where the entry
%was defined.
%
%You may need to \LaTeX\ your document again (just as you have to do 
%with \cmdname{tableofcontents}, \cmdname{listoffigures} etc).
%
%\item I'm getting a \appname{keyval} error.
%
%The \styname{glossary} package uses the \styname{keyval} 
%package to extract the information from \meta{key}=\meta{value}
%comma separated lists.  You need to make sure the syntax is correct.  
%If your \meta{value} contains a 
%comma, you will need to enclose \meta{value} in curly braces. See the \styname{keyval} documentation for
%further information\footnote{This should be in the directory 
%\texttt{texmf/doc/latex/graphics/}}.
%
%\item I've used the \pkgopt{hyper} option, but nothing happens 
%when I click on the numbers in the glossary.
%
%Check the following:
%\begin{enumerate}
%\item Have you remembered to use PDF\LaTeX\ instead of \LaTeX,
%or used a driver that understands hyperlinks?
%\item Have you remembered to use the \styname{hyperref} or
%\styname{html} package?
%\item Have you remembered to use a formatting command which uses \cmdname{hyperlink}? (E.g.\ using \glsnumfmt{hyperbf} instead
%of \texttt{textbf})?  Remember to check the \gloskey{format} key
%in your \icmdname{glossary} commands, and the 
%\setglos{glsnumformat} key in the \icmdname{setglossary}
%command.
%\item What application are you using to view the PDF file?
%Ghostview can display a PDF file, but ignores the links.  If you are using Windows, try
%using Adobe's Acrobat Reader, or if you are using UNIX or Linux, try using \appname{xpdf} or \appname{acroread}.
%\end{enumerate}
%
%\item The \styname{glossary} package conflicts with the 
%\styname{datetime} package.
%\changes{2.01}{21 Oct 2004}{Fixed conflict with datetime package}
%
%This has been fixed in version 2.01.
%
%\item I get an error when using certain commands, such as \cmdname{cite} or \verb"~" in \icmdname{newacronym}.
%
%This has been fixed in version 2.1.
%
%\item I get the following error:
%\begin{verbatim}
%! Package array Error: Illegal pream-token (\glossaryalignment): `c' used.
%\end{verbatim}
%
%The \styname{glossary} package used to conflict with the 
%\styname{array} package.  This was fixed in version 2.1. 
%As from version 2.3, it doesn't matter whether you load
%the \styname{glossary} package before or after the
%\styname{array} package.
%
%\item\label{itm:fragile} I get the following error:
%\begin{verbatim}
%Use of \@chapter doesn't match its definition
%\end{verbatim}
%or
%\begin{verbatim}
%! Argument of \@sect has an extra }
%\end{verbatim}
%
%If you want to use an acronym command in a moving argument (such as a chapter heading)
%you need to \cmdname{protect} it first.  Note that if you do put an acronym in a chapter etc 
%heading, it will be expanded for the first time in the table of contents, not
%in the chapter heading.  The best way to get around this is to use the
%optional argument, e.g.
%\begin{verbatim}
%\chapter[Introduction to Kernel Support Vector Machines]{Introduction 
%to \protect\KSVM}
%\end{verbatim}
%You will also need to do this if you are using bookmarks in a PDF document.
%
%Alternatively, you can do:
%\begin{verbatim}
%\resetacronym{KSVM}
%\chapter{Introduction to \protect\KSVM}
%\end{verbatim}
%or if you are using PDFLaTeX:
%\begin{verbatim}
%\resetacronym{KSVM}
%\chapter{Introduction to \texorpdfstring{\protect\KSVM}{KSVM}}
%\end{verbatim}
%
%\item\label{itm:ngerman} The \styname{glossary} package conflicts with 
%\styname{ngerman}.
%
%This problem is caused by the fact that \styname{ngerman} 
%redefines the effect of the double quote
%character, but this character is used in the creation of the 
%\filetype{ist} \appname{makeindex} style file.
%Try one of the following methods:
%\begin{enumerate}
%\item Include the \styname{ngerman} package after the 
%\icmdname{makeglossary} command:
%\begin{verbatim}
%\usepackage{glossary}
%\makeglossary
%\usepackage{ngerman}
%\end{verbatim}
%
%\item First omit the \styname{ngerman} package and include 
%\icmdname{makeglossary} then \LaTeX\ your document.
%This will create the \filetype{ist} file.  Then include the 
%\styname{ngerman} package, and insert \icmdname{noist} before
%the \icmdname{makeglossary} command, this will prevent further attempts to generate the \filetype{ist} file.
%\begin{verbatim}
%\usepackage{ngerman}
%\usepackage{glossary}
%\noist\makeglossary
%\end{verbatim}
%
%\item Use \icmdname{noist}, as above, and create the 
%\filetype{ist} file
%in an ordinary text editor. The file should contain the
%following lines:
%\begin{verbatim}
%keyword "\\glossaryentry"
%preamble "\\begin{theglossary}"
%postamble "\n\\end{theglossary}\n"
%group_skip "\\gloskip "
%item_0 "\n\\gloitem "
%delim_0 "\n\\glodelim "
%page_compositor "-"
%delim_n "\\delimN "
%delim_r "\\delimR "
%\end{verbatim}
%\end{enumerate}
%It is possible that there may be other packages which will 
%also cause a problem, if so, try any of the above.
%
%\item \appname{makeglos.pl} gives the following error message:
%\begin{verbatim}
%unable to extract name from glossary item:
%\end{verbatim}
%
%You are using an old version of \appname{makeglos.pl} with a
%new version of the \styname{glossary} package. You will need
%to update your version \appname{makeglos.pl}.
%\end{enumerate}
%Let me know if you encounter any other problems or if you have any comments regarding this package.
%
%\section{Obsolete Commands}
%
%The commands described in this section are now obsolete, but 
%are currently still provided for backwards compatibility.  Their
%use is deprecated.
%
%\changes{2.14}{2005 May 28}{'saveglosentry added}
%\DescribeMacro{\saveglosentry}
%\icmdname{saveglosentry}\{\textrm{\meta{name}}\}\{\meta{description}\}\\
%This command has now been replaced by \cmdname{storeglosentry}.
%
%\changes{2.0}{2004 November 1}{primary acronym number format 
%\texttt{'glsprimaryfmt}}
%\changes{2.12}{2004 November 1}{primary acronym number format 
%\texttt{'glsprimaryfmt} no longer used}
%\changes{2.4}{2006 July 20}{primary acronym number format
%\texttt{'glsprimaryfmt} has been removed}
%\DescribeMacro{\glsprimaryfmt}%
%The command \cmdname{glsprimaryfmt} has now been removed.
%
%The package option \pkgopt{hyperacronym} is now superseded by the package option
%\pkgopt{hyper}. This option was implemented prior to the
%introduction of the command \icmdname{xglossary}. Since the
%acronyms now use \icmdname{xglossary}, there is no difference
%between the \pkgopt{hyperacronym} and \pkgopt{hyper} options. 
%This option has a boolean value:
%\changes{2.13}{2004 December 1}{Package option \texttt{hyperacronym}}
%\begin{description}
%\item[\pkgoptval{true}{hyperacronym}] Make acronyms link to their corresponding entry in the glossary
%\item[\pkgoptval{false}{hyperacronym}] Acronyms don't have a hyperlink.
%\end{description}
%If the \styname{hyperref} package has been loaded prior to 
%loading \texttt{glossary.sty} or if \pkgopt[true]{hyper} is set,
%\pkgopt[true]{hyperacronym} otherwise 
%\pkgopt[false]{hyperacronym}.%
%
%\section{Contact Details}
%\noindent
%Dr Nicola Talbot\\
%School of Computing Sciences\\
%University of East Anglia\\
%Norwich. Norfolk\\
%NR4 7TJ. United Kingdom.\\
%\url{http://theoval.cmp.uea.ac.uk/~nlct/}
%
%\section{Acknowledgements}
%
%I would like to thank all the many people who have made suggestions
%and pointed out bugs.
%
% \StopEventually{\PrintChanges\addcontentsline{toc}{section}{Change History}\PrintIndex\addcontentsline{toc}{section}{Index}}
%
%
%
%
%\section{The Code}
%    \begin{macrocode}
%<*glossary.sty>
%    \end{macrocode}
% \subsection{Package Definition}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{glossary}[2006/07/20 2.4 (NLCT)]
%    \end{macrocode}
% Load packages needed by glossary.sty:
%    \begin{macrocode}
\RequirePackage{ifthen}
\RequirePackage{keyval}
%    \end{macrocode}
% The package options are in the form of a comma-separated list of
% \meta{key}=\meta{value} pairs.  First need to set up the keys.
%
% The \pkgopt{style} key. This may be one of \pkgoptval{list}{style},
% \pkgoptval{altlist}{style} (use \envname{description} environment),
% \pkgoptval{super}{style} (use \envname{supertabular} environment) or
% \pkgoptval{long}{style} (use \envname{longtable} environment).
%    \begin{macrocode}
\define@key{gloss}
{style}
{\ifthenelse{\equal{#1}{list} \or \equal{#1}{altlist}
\or \equal{#1}{super} \or \equal{#1}{long}}
{\def\gls@style{#1}}
{\PackageError{glossary}
{Unknown glossary style '#1'}
{Available styles are: list, altlist, super and long}}}
%    \end{macrocode}
% The \pkgopt{header} key. This can either be \pkgoptval{none}{header}
% or \pkgoptval{plain}{header}. Should only be used in conjunction 
% with \pkgopt[style]{super} or \pkgopt[long]{style}.
%    \begin{macrocode}
\define@key{gloss}
{header}[plain]{\ifthenelse{\equal{#1}{none} \or \equal{#1}{plain}}
{\def\gls@header{#1}}
{\PackageError{glossary}
{Unknown glossary style '#1'}
{Available styles are: none and plain}}}
%    \end{macrocode}
% The \pkgopt{border} key. This can either be \pkgoptval{none}{border}
% or \pkgoptval{plain}{border}. Should only be used in conjunction 
% with \pkgopt[super]{style} or \pkgopt[long]{style}.
%    \begin{macrocode}
\define@key{gloss}
{border}[plain]{\ifthenelse{\equal{#1}{none} \or \equal{#1}{plain}}
{\def\gls@border{#1}}
{\PackageError{glossary}
{Unknown glossary border '#1'}
{Available styles are: none and plain}}}
%    \end{macrocode}
% Number of columns (either \pkgoptval{2}{cols} or 
% \pkgoptval{3}{cols}). Should only be used in conjunction with
% \pkgopt[super]{style} or \pkgopt[long]{style}.
%    \begin{macrocode}
\newcount\gls@cols
\define@key{gloss}{cols}{\gls@cols=#1\relax
\ifthenelse{\gls@cols<2 \or \gls@cols>3}
{\PackageError{glossary}
{invalid number of columns}
{The cols option can only be 2 or 3}}
{}}
%    \end{macrocode}
% The number key may either be \pkgoptval{none}{number} or the name of
% a counter.
%    \begin{macrocode}
\define@key{gloss}
{number}
{\ifthenelse{\equal{#1}{none}}
{\def\gls@glossary@number{#1}}
{\@ifundefined{c@#1}{
\PackageError{glossary}
{Unknown glossary number style '#1'}
{You may either specify "none" or the name of a counter,
e.g. "section"}\def\gls@glossary@number{page}}{\def\gls@glossary@number{#1}}}}
%    \end{macrocode}
% The \pkgopt{toc} key. If set, adds the glossary to the table of 
% contents
%    \begin{macrocode}
\newif\ifgls@toc
\define@key{gloss}{toc}[true]{\ifthenelse{\equal{#1}{true}
\or \equal{#1}{false}}
{\csname gls@toc#1\endcsname}
{\PackageError{glossary}{Glossary option 'toc' is boolean}
{The value of 'toc' can only be set to 'true' or 'false'}}}
%    \end{macrocode}
% The \pkgopt{hypertoc} key. Like \pkgopt{toc}, but puts the anchor 
% before the section heading. Should only be used if the 
% \styname{hyperref} package is used (because it uses
%  \icmdname{phantomsection}).
%    \begin{macrocode}
\newif\ifgls@hypertoc
\define@key{gloss}{hypertoc}[true]{%
\ifthenelse{\equal{#1}{true} \or \equal{#1}{false}}
{\csname gls@hypertoc#1\endcsname}
{\PackageError{glossary}{Glossary option 'hypertoc' is boolean}
{The value of 'hypertoc' can only be set to 'true' or 'false'}}}
%    \end{macrocode}
% The \pkgopt{section} key. This will put the glossary in an unnumbered
% section, even if chapters are defined.
%    \begin{macrocode}
\newif\ifgls@section
\define@key{gloss}{section}[true]{%
\ifthenelse{\equal{#1}{true} \or \equal{#1}{false}}
{\csname gls@section#1\endcsname}
{\PackageError{glossary}{Glossary option 'section' is boolean}
{The value of 'section' can only be set to 'true' or 'false'}}}
\gls@sectionfalse
%    \end{macrocode}
% Enable hyperlinks. If \styname{hyperref} or \styname{html}
% packages loaded, \pkgopt[true]{hyper} is the default.
%    \begin{macrocode}
\newif\ifglshyper
\newif\ifglshyperacronym
\define@key{gloss}{hyper}[true]{%
\ifthenelse{\equal{#1}{true} \or \equal{#1}{false}}
{\csname glshyper#1\endcsname\glshyperacronymtrue}
{\PackageError{glossary}{Glossary option 'hyper' is boolean}
{The value of 'hyper' can only be set to 'true' or 'false'}}}
%    \end{macrocode}
% Enable hyperlinks for acronyms. Deprecated: use \pkgopt{hyper}
% instead.
%    \begin{macrocode}
\define@key{gloss}{hyperacronym}[true]{%
\ifthenelse{\equal{#1}{true} \or \equal{#1}{false}}
{\csname glshyperacronym#1\endcsname}
{\PackageError{glossary}{Glossary option 'hyperacronym' is boolean}
{The value of 'hyperacronym' can only be set to 'true' or 'false'}}}
%    \end{macrocode}
% The \pkgopt{acronym} key. If set, the acronyms will be separate from
% main glossary entries. Remember to use \icmdname{makeacronym}
% and \icmdname{printacronym} if \pkgoptval{true}{acronym}.
%    \begin{macrocode}
\newif\ifglsacronym
\define@key{gloss}{acronym}[true]{%
\ifthenelse{\equal{#1}{true} \or \equal{#1}{false}}
{\setboolean{glsacronym}{#1}}{%
\PackageError{glossary}{Glossary option 'acronym' is boolean}{The
value of 'acronym' can only be set to 'true' or 'false'}}}
%    \end{macrocode}
% The \pkgopt{global} key. If not set, any acronyms expanded in a 
% group will be treated as unused once outside of the group.
% Set \pkgopt[true]{global} to prevent this.
%    \begin{macrocode}
\newif\ifglsglobal
\define@key{gloss}{global}[true]{\ifthenelse{\equal{#1}{true}\or
\equal{#1}{false}}{\setboolean{glsglobal}{#1}}{%
\PackageError{glossary}{Glossary option 'global' is boolean}{The
value of 'global' can only be set to 'true' or 'false'}}}
%    \end{macrocode}
% Set up defaults
%    \begin{macrocode}
\def\gls@style{long}
\def\gls@header{none}
\def\gls@border{none}
\def\gls@glossary@number{page}
\gls@cols=2\relax
\gls@tocfalse
%    \end{macrocode}
% If \icmdname{hyperpage} is defined, then assume hyperlinks required
%    \begin{macrocode}
\@ifundefined{hyperpage}{\glshyperfalse\glshyperacronymfalse}{%
\glshypertrue\glshyperacronymtrue}
%    \end{macrocode}
% If \icmdname{hypertarget} defined, then \icmdname{glosslabel} will make a 
% target ("#1") and \icmdname{glossref} will make a hyperlink (to "#1").
% Otherwise will simply print the second argument.
%    \begin{macrocode}
\@ifundefined{hypertarget}{
% no hyperlinks
\newcommand{\glosslabel}[2]{#2}%
\newcommand{\glossref}[2]{#2}%
}{%
\newcommand{\glosslabel}[2]{\hypertarget{#1}{#2}}%
\newcommand{\glossref}[2]{\hyperlink{#1}{#2}}
}
%    \end{macrocode}
% If the \styname{xspace} package has been loaded, use \icmdname{xspace}
% in acronyms.
%    \begin{macrocode}
\@ifundefined{xspace}{%
\let\glsxspace\relax}{%
\let\glsxspace\xspace}
%    \end{macrocode}
% Set \icmdname{glossaryalignment} to "\relax" before loading
% configuration file.
%    \begin{macrocode}
\let\glossaryalignment\relax
%    \end{macrocode}
% Load configuation file if it exists
%    \begin{macrocode}
\newcommand{\glossarypackageoptions}[1]{\setkeys{gloss}{#1}}
\InputIfFileExists{glossary.cfg}{%
\typeout{Glossary configuration file loaded}}{%
\typeout{No configuration file glossary.cfg found}}
\renewcommand{\glossarypackageoptions}[1]{%
\PackageError{glossary}{Command \string\glossarypackageoptions 
^^Jcan only be used in configuration file}{}}
%    \end{macrocode}
% Set up the options so that they are treated as a 
% \meta{key}=\meta{value} list.
%    \begin{macrocode}
\DeclareOption*{\edef\@pkg@ptions{\noexpand
\setkeys{gloss}{\CurrentOption}}
\ifthenelse{\equal{\CurrentOption}{}}{}{\@pkg@ptions}}
%    \end{macrocode}
% Process options
%    \begin{macrocode}
\ProcessOptions
%    \end{macrocode}
%Check to make sure that the options don't conflict.
%    \begin{macrocode}
\ifthenelse{\(\equal{\gls@style}{list} \or 
\equal{\gls@style}{altlist}\) \and 
\(\not\equal{\gls@header}{none} \or \not\equal{\gls@border}{none}
\or \gls@cols=3\)}
{\PackageError{glossary}{You can't have option 'style=list' or 
'style=altlist' in combination with any of the other style 
options}{The 'list' and 'altlist' options don't have a header, 
border or number of columns option.}}
{}
%    \end{macrocode}
% Can't have both toc and hypertoc. Make it a warning rather
% than an error.
%    \begin{macrocode}
\ifthenelse{\boolean{gls@hypertoc} \and \boolean{gls@toc}}{%
\PackageWarning{glossary}{Can't have both 'toc' and
'hypertoc', ignoring 'toc' option}
\ifgls@hypertoc\gls@tocfalse\fi}{}
%    \end{macrocode}
%\subsection{Redefining \texorpdfstring{\texttt{\symbol{92}glossary}}{\textbackslash glossary} format}
% The glossary is going to be redefined so that it accepts 
% \meta{key}=\meta{value} information, so need to define the keys (see
% keyval documentation for further details
% on how to do this.) Added "\@onelevel@sanitize" at the recommendation
% of Dan~Luecking and Ulrich~Diez.
%    \begin{macrocode}
\define@key{wrgloss}{name}{%
\def\@glo@n@me{#1}%
\@onelevel@sanitize\@glo@n@me%
\global\let\@glo@n@me\@glo@n@me}
\define@key{wrgloss}{description}{%
\def\@descr{#1}%
\@onelevel@sanitize\@descr}
\define@key{wrgloss}{sort}{%
\def\@s@rt{#1}%
\@onelevel@sanitize\@s@rt
\global\let\@s@rt\@s@rt}
\define@key{wrgloss}{format}{\def\@f@rm@t{#1}}
\define@key{wrgloss}{number}{\def\@glo@num{#1}}
%    \end{macrocode}
% Redefine "\@wrglossary" so that it separates out the entry name and 
% entry description. This was rewritten in version 2.4. It is now
% used for both the main glossary, and user-defined glossaries.
% The command "\@@wrglossary" is called at the end of "\@wrglossary",
% by default this does nothing, but some commands temporarily
% redefine it.
%    \begin{macrocode}
\newcommand{\@@wrglossary}{}
%    \end{macrocode}
% The label for each entry is usually made up of the glossary prefix
% followed by the sort value, this can be over-ridden by redefining
% \cmdname{@glo@l@bel}. (This is done if the optional argument to 
% \icmdname{glossary} is used.) By default this does nothing.
%    \begin{macrocode}
\newcommand{\@glo@l@bel}{}
%    \end{macrocode}
% Define the prefix for the principle glossary. (Added to version
% 2.4.)
%    \begin{macrocode}
\newcommand{\@gls@glossary@type}{glo}
%    \end{macrocode}
% The optional first argument was added in version 2.4. This
% is the name of the glossary type.
%    \begin{macrocode}
\renewcommand{\@wrglossary}[2][glossary]{\relax
\gdef\@glo@n@me{}\def\@descr{}\def\@s@rt{}\def\@f@rm@t{}%
\edef\@glo@num{\csname gls@#1@number\endcsname}\relax
\xdef\@pr@fix{\csname @gls@#1@type\endcsname}%
 \setkeys{wrgloss}{#2}\relax
\ifthenelse{\equal{\@glo@num}{none}}{\def\@@glo@num{\thepage}}{%
\@ifundefined{c@\@glo@num}{\PackageError{glossary}{%
Not such counter '\@glo@num'}{The value of the 'number' key
must be the name of a counter or the word "none"}%
\def\@@glo@num{\thepage}}{%
\edef\@@glo@num{\csname the\@glo@num\endcsname}}}%
\ifthenelse{\equal{\@s@rt}{}}{\gdef\@s@rt{\@glo@n@me}}{}%
\ifthenelse{\equal{\@glo@l@bel}{}}{%
\gdef\@glo@l@bel{\@pr@fix:\@s@rt}}{}%
%    \end{macrocode}
% User has not specified a format, so use default
%    \begin{macrocode}
\ifthenelse{\equal{\@f@rm@t}{}}
{\expandafter\protected@write\csname @#1file\endcsname{}%
{\string\glossaryentry{\@s@rt @{%
\string\glosslabel{\@glo@l@bel}{\@glo@n@me}}\@descr
\string\relax|glsnumformat}{\@@glo@num}}}
%    \end{macrocode}
% User has specified a format. If it is one of the 
% "\hyper"\meta{xx} types, append the required counter.
% This is needed if the glossary contains a mixture of
% counters used (as in "sampleEqPg.tex").
%    \begin{macrocode}
{\ifthenelse{\equal{\@f@rm@t}{hyperrm} \or
\equal{\@f@rm@t}{hypersf} \or \equal{\@f@rm@t}{hypertt}
\or \equal{\@f@rm@t}{hypermd} \or \equal{\@f@rm@t}{hyperbf}
\or \equal{\@f@rm@t}{hyperit} \or \equal{\@f@rm@t}{hyperem}
\or \equal{\@f@rm@t}{hypersl} \or \equal{\@f@rm@t}{hyperup}
\or \equal{\@f@rm@t}{hypersc}}
{\expandafter\protected@write\csname @#1file\endcsname{}%
    {\string\glossaryentry{\@s@rt @{%
     \string\glosslabel{\@glo@l@bel}{\@glo@n@me}}\@descr
     \string\relax|\@f@rm@t[\@glo@num]}{\@@glo@num}}}
{\expandafter\protected@write\csname @#1file\endcsname{}%
    {\string\glossaryentry{\@s@rt @{%
     \string\glosslabel{\@glo@l@bel}{\@glo@n@me}}\@descr
     \string\relax|\@f@rm@t}{\@@glo@num}}}}\relax
 \endgroup\@esphack
\@@wrglossary
}
%    \end{macrocode}
% Command to extract name key from glossary entry. This shouldn't
% be sanitized, so define a new key for this
%    \begin{macrocode}
\define@key{wrnsgloss}{name}{\def\@glo@n@me{#1}}
\define@key{wrnsgloss}{description}{\def\@descr{#1}}
\define@key{wrnsgloss}{sort}{\def\@s@rt{#1}}
\define@key{wrnsgloss}{format}{\def\@f@rm@t{#1}}
\define@key{wrnsgloss}{number}{\def\@glo@num{#1}}
%    \end{macrocode}
% Extract name from key-value list. Name stored in "\@glo@n@me".
%    \begin{macrocode}
\newcommand{\@gls@getn@me}[1]{%
\def\@glo@n@me{}\setkeys{wrnsgloss}{#1}%
}
%    \end{macrocode}
% Command to extract description key from glossary entry.
%    \begin{macrocode}
\newcommand{\@gls@getdescr}[1]{%
\@bsphack\begingroup
\def\@descr{}%
\setkeys{wrgloss}{#1}%
\global\let\@glo@desc\@descr
\endgroup\@esphack
}
%    \end{macrocode}
% Now define \icmdname{xglossary} so you can have a hyperlink that takes
% you to the entry in the glossary
%    \begin{macrocode}
\newcommand{\xglossary}{\renewcommand{\@@wrglossary}[1]{%
\glossref{\@glo@l@bel}{##1}\renewcommand{\@@wrglossary}{}}%
\glossary}
%    \end{macrocode}
%\subsection{Storing Glossary Entries}
% Provide a means to store glossary information to save typing
% and ensure consistency (new to v2.17).
%
% Store label in list (new to version 2.36) so that all
% entries can be added to the glossary with a single command.
%    \begin{macrocode}
\newcommand*{\@glo@label@list}{}
\toksdef\gls@ta=0 \toksdef\gls@tb=2
\newcommand{\@glo@label@addtolist}[1]{%
\gls@ta={{#1}}\gls@tb=\expandafter{\@glo@label@list}%
\xdef\@glo@label@list{\the\gls@ta,\the\gls@tb}}
%    \end{macrocode}
% First define command to store details (don't allow a label
% consisting solely of a "*" as this represents all entries
% when passed to \icmdname{useglosentry}.)
%    \begin{macrocode}
\newcommand*{\storeglosentry}[3][glossary]{%
\ifthenelse{\equal{#2}{*}}{%
\PackageError{glossary}{Glossary label '*' invalid}{You can't have
a glossary entry with a * as the label}}{%
\@ifundefined{glo@#2@entry}{%
\@glo@label@addtolist{#2}%
\expandafter\def\csname glo@#2@type\endcsname{#1}%
\expandafter\def\csname glo@#2@entry\endcsname{#3}%
\@gls@getn@me{#3}%
\expandafter\protected@edef\csname glo@#2@name\endcsname{\@glo@n@me}%
}{%
\PackageError{glossary}{Glossary entry '#2' already 
defined}{There already exists a glossary entry with the label '#2'}}}%
}
%    \end{macrocode}
% This command will not produce text in the document, but will
% produce the relevant glossary entry.
%    \begin{macrocode}
\providecommand{\useglosentry}[2][\relax]{%
\ifthenelse{\equal{#2}{*}}{\@for\@glolab:=\@glo@label@list\do{%
\ifthenelse{\equal{\@glolab}{}}{}{\useglosentry[#1]{\@glolab}}}}{%
\@ifundefined{glo@#2@type}{%
\PackageError{glossary}{Glossary entry '#2' undefined}{You need 
to define the entry using \string\storeglosentry\space before 
using it.}}{{%
\edef\@glostype{\csname glo@#2@type\endcsname}%
\@glo@tb=\expandafter\expandafter\expandafter
{\csname glo@#2@entry\endcsname}%
\ifx#1\relax
\edef\@glo@cmd{\expandafter\noexpand
\csname\@glostype\endcsname{\the\@glo@tb}}%
\else
\edef\@glo@cmd{\expandafter\noexpand
\csname\@glostype\endcsname{\the\@glo@tb,#1}}%
\fi
\@glo@cmd
}}}}
%    \end{macrocode}
% This command will produce the specified text in the document 
% (with a hyperlink if enabled), and will produce the relevant 
% glossary entry.
%    \begin{macrocode}
\providecommand{\useGlosentry}[3][\relax]{%
\@ifundefined{glo@#2@type}{%
\PackageError{glossary}{Glossary entry '#2' undefined}{You need 
to define the entry using \string\storeglosentry\space before 
using it.}}{{%
\edef\@glostype{x\csname glo@#2@type\endcsname}%
\@glo@tb=\expandafter\expandafter\expandafter
{\csname glo@#2@entry\endcsname}%
\ifx#1\relax
\edef\@glo@cmd{\expandafter\noexpand
\csname\@glostype\endcsname{\the\@glo@tb}}%
\else
\edef\@glo@cmd{\expandafter\noexpand
\csname\@glostype\endcsname{\the\@glo@tb,#1}}%
\fi
\@glo@cmd{#3}%
}}}
%    \end{macrocode}
% As above, but the text displayed in the document is constructed from
% the \gloskey{name} key.
%    \begin{macrocode}
\newcommand{\gls}[2][\relax]{%
\useGlosentry[#1]{#2}{%
\csname glo@#2@name\endcsname}}
%    \end{macrocode}
% This command was defined in earlier verions, but doesn't
% work very well, currently retained for backwards compatibility,
% but may well be removed at a later date.
%    \begin{macrocode}
\providecommand{\saveglosentry}[3][glossary]{%
\PackageWarning{glossary}{\string\saveglosentry\space is obsolete, 
please use \string\storeglosentry\space instead}%
\expandafter\def\csname glo@#2@type\endcsname{#1}%
\expandafter\def\csname glo@#2@entry\endcsname{%
name={#2},description={#3}}}
%    \end{macrocode}
%Set up default number formats, dependent on the package \pkgopt{number} 
% option.  Define default page compositor.  Any redefinition of the 
% page compositor will need to come before the ".ist" file is 
% written.  The other commands can be redefined at any point before 
% \icmdname{printglossary}.
%
% Define a command to set up the glossary counter.
% The optional argument specifies the glossary type
% (defaults to the main glossary). The mandatory
% command is the name of the counter, or "none".
%    \begin{macrocode}
\newcommand*{\@gls@setnumbering}[2][glossary]{%
%    \end{macrocode}
% If no numbering (\pkgopt[none]{number}):
%    \begin{macrocode}
\ifthenelse{\equal{#2}{none}}{%
\def\pagecompositor{-}
\expandafter\def\csname @#1@delimN\endcsname{}
\expandafter\def\csname @#1@delimR\endcsname{}
\expandafter\def\csname glsX#1Xnumformat\endcsname##1{}}{%
%    \end{macrocode}
% If "number=page", set the page compositor to
% "-" (dash) otherwise set it to "." (dot).
%    \begin{macrocode}
\ifthenelse{\equal{#2}{page}}{%
\def\pagecompositor{-}}{%
\def\pagecompositor{.}}
%    \end{macrocode}
% Set up delimiters and formats
%    \begin{macrocode}
\expandafter\def\csname @#1@delimN\endcsname{, }
\expandafter\def\csname @#1@delimR\endcsname{--}
\ifglshyper
\expandafter\def\csname glsX#1Xnumformat\endcsname##1{%
\hyperrm[#2]{##1}}%
\else
\expandafter\def\csname glsX#1Xnumformat\endcsname##1{##1}\fi
}
%    \end{macrocode}
% End of "\@gls@setnumbering" definition:
%    \begin{macrocode}
}
%    \end{macrocode}
% Now call it to set up current numbering:
%    \begin{macrocode}
\@gls@setnumbering{\gls@glossary@number}
%    \end{macrocode}
% Provide a means of changing the page number format for a 
% given glossary type.
%    \begin{macrocode}
\newcommand{\glsnumformat}[1]{%
\@ifundefined{\@glostype}{\def\@glostype{glossary}}{}%
\@ifundefined{glsX\@glostype Xnumformat}{%
\PackageError{glossary}{Glossary type '\@glostype' undefined}{}}{%
\csname glsX\@glostype Xnumformat\endcsname{#1}}}
%    \end{macrocode}
% Set the default glossary type
%    \begin{macrocode}
\def\@glostype{glossary}
%    \end{macrocode}
% Make the delimiters etc depend on the glossary type.
% "\@glostype" should be set to the appropriate glossary type
% before using any of these commands.
%    \begin{macrocode}
\newcommand{\delimN}{\csname @\@glostype @delimN\endcsname}
\newcommand{\delimR}{\csname @\@glostype @delimR\endcsname}
\newcommand{\gloitem}{\csname @\@glostype @gloitem\endcsname}
\newcommand{\gloskip}{\csname @\@glostype @gloskip\endcsname}
\newcommand{\delimT}{\glsafternum
\csname @\@glostype @delimT\endcsname}
\newcommand{\glodelim}{\csname @\@glostype @glodelim\endcsname
\glsbeforenum}
%    \end{macrocode}
% Add facility to insert text between groups. By default these do
% nothing.
%    \begin{macrocode}
\newcommand{\glogroupSymbols}{}
\newcommand{\glogroupNumbers}{}
\newcommand{\glogroupA}{}
\newcommand{\glogroupB}{}
\newcommand{\glogroupC}{}
\newcommand{\glogroupD}{}
\newcommand{\glogroupE}{}
\newcommand{\glogroupF}{}
\newcommand{\glogroupG}{}
\newcommand{\glogroupH}{}
\newcommand{\glogroupI}{}
\newcommand{\glogroupJ}{}
\newcommand{\glogroupK}{}
\newcommand{\glogroupL}{}
\newcommand{\glogroupM}{}
\newcommand{\glogroupN}{}
\newcommand{\glogroupO}{}
\newcommand{\glogroupP}{}
\newcommand{\glogroupQ}{}
\newcommand{\glogroupR}{}
\newcommand{\glogroupS}{}
\newcommand{\glogroupT}{}
\newcommand{\glogroupU}{}
\newcommand{\glogroupV}{}
\newcommand{\glogroupW}{}
\newcommand{\glogroupX}{}
\newcommand{\glogroupY}{}
\newcommand{\glogroupZ}{}
%    \end{macrocode}
% Allow user to change number format for different 
% glossary types.
%    \begin{macrocode}
\define@key{glossnum}{glsnumformat}{\def\@glsnumformat{#1}}
\define@key{glossnum}{type}{\def\@glsnumtype{#1}}
\define@key{glossnum}{delimN}{\def\@delimN{#1}}
\define@key{glossnum}{delimR}{\def\@delimR{#1}}
\define@key{glossnum}{delimT}{\def\@delimT{#1}}
\define@key{glossnum}{gloskip}{\def\@gloskip{#1}}
\define@key{glossnum}{glodelim}{\def\@glodelim{#1}}
%    \end{macrocode}
% Define a command that will ignore its argument. This is used
% when suppressing the page numbers.
%    \begin{macrocode}
\providecommand{\ignore}[1]{}
%    \end{macrocode}
% Define command that allows the user to modify the style for a 
% given glossary type.
%    \begin{macrocode}
\newcommand{\setglossary}[1]{%
\def\@glsnumformat{}%
\def\@glsnumtype{glossary}%
\def\@delimN{@dontchange@}%
\def\@delimR{@dontchange@}%
\def\@delimT{@dontchange@}%
\def\@gloskip{@dontchange@}%
\def\@glodelim{@dontchange@}%
\setkeys{glossnum}{#1}\relax
\@ifundefined{print\@glsnumtype}{%
\PackageError{glossary}{Invalid glossary type '\@glsnumtype'}{%
Glossary type '\@glsnumtype' has not been defined}
}{%
\ifthenelse{\equal{\@glsnumformat}{}}{}{%
\expandafter\xdef\csname glsX\@glsnumtype Xnumformat\endcsname{%
\noexpand\csname\@glsnumformat\noexpand\endcsname}%
\ifthenelse{\equal{\@glsnumformat}{ignore}}{%
\expandafter\xdef\csname @\@glsnumtype @delimN\endcsname{}%
\expandafter\xdef\csname @\@glsnumtype @delimR\endcsname{}%
}{}%
}%
%
\ifthenelse{\equal{\@delimN}{@dontchange@}}{}{%
\expandafter\xdef\csname @\@glsnumtype @delimN\endcsname{%
\@delimN}}%
%
\ifthenelse{\equal{\@delimR}{@dontchange@}}{}{%
\expandafter\xdef\csname @\@glsnumtype @delimR\endcsname{%
\@delimR}}%
%
\ifthenelse{\equal{\@delimT}{@dontchange@}}{}{%
\expandafter\xdef\csname @\@glsnumtype @delimT\endcsname{%
\@delimT}}%
%
\ifthenelse{\equal{\@gloskip}{@dontchange@}}{}{%
\expandafter\xdef\csname @\@glsnumtype @gloskip\endcsname{%
\@gloskip}}%
%
\ifthenelse{\equal{\@glodelim}{@dontchange@}}{}{%
\expandafter\xdef\csname @\@glsnumtype @glodelim\endcsname{%
\@glodelim}%
}%
}}
%    \end{macrocode}
% Now define the command \icmdname{printglossary} which will print the 
% contents of the glossary file. Define the file extension for the main
% glossary:
%    \begin{macrocode}
\newcommand{\@gls@glossary@inext}{gls}
%    \end{macrocode}
% The optional argument is the glossary type, the default is the
% main glossary. This sets "\gls@number" to "\gls@#1@number"
% before reading in the file. This ensures that \icmdname{hyperrm} etc
% use the correct counter in the target name.
%    \begin{macrocode}
\newcommand\printglossary[1][glossary]{%
\def\@glostype{#1}%
\@ifundefined{#1name}{%
\renewcommand{\@glossaryname}{\glossaryname}}{%
\renewcommand{\@glossaryname}{\csname #1name\endcsname}}%
\@ifundefined{short#1name}{%
\renewcommand{\@shortglossaryname}{\@glossaryname}}{%
\renewcommand{\@shortglossaryname}{\csname short#1name\endcsname}}%
\expandafter\let\expandafter\gls@number\csname gls@#1@number\endcsname
\@input@{\jobname.\csname @gls@#1@inext\endcsname}}
%    \end{macrocode}
% Define contextual names. Changed \verb/\newcommand/
% to \verb/\providecommand/ in version 2.2.
%    \begin{macrocode}
\providecommand{\glossaryname}{Glossary}
\newcommand{\shortglossaryname}{\glossaryname}
\newcommand{\entryname}{Notation}
\newcommand{\descriptionname}{Description}
\newcommand{\istfilename}{\jobname.ist}
\def\@glossaryname{\glossaryname}
\def\@shortglossaryname{\shortglossaryname}
%    \end{macrocode}
% Version 2.4 also writes ist filename to aux file. This
% is only used by makeglos.pl, so ignore.
%    \begin{macrocode}
\newcommand{\@istfilename}[1]{}
%    \end{macrocode}
% Define command to generate glossary title (new to
% version 2.24)
%    \begin{macrocode}
\providecommand{\glossarytitle}{%
\@ifundefined{chapter}%
%    \end{macrocode}
% "\chapter" not defined, use "\section*"
%    \begin{macrocode}
{%
\ifgls@hypertoc
%    \end{macrocode}
% \pkgopt{hypertoc} option used, so use "\phantomsection" to add
% anchor \emph{before} "\section*"
%    \begin{macrocode}
\phantomsection
\@glosaddtoc{section}%
\section*{\@glossaryname}\relax
\else
%    \end{macrocode}
% \pkgopt[false]{hypertoc}: add to toc after "\section*"
%    \begin{macrocode}
\section*{\@glossaryname}\relax
%    \end{macrocode}
% only add contentsline if toc=true
%    \begin{macrocode}
\ifgls@toc\@glosaddtoc{section}\fi
\fi}%
%    \end{macrocode}
% "\chapter" defined, but has user requested "\section" instead?
%    \begin{macrocode}
{%
\ifthenelse{\boolean{gls@section}}%
{%
%    \end{macrocode}
% user requested "\section"
%    \begin{macrocode}
\ifgls@hypertoc
%    \end{macrocode}
% User request \pkgopt[true]{hypertoc}, so add anchor \emph{before}
% "\section":
%    \begin{macrocode}
\phantomsection
\@glosaddtoc{section}%
\section*{\@glossaryname}\relax
\else
%    \end{macrocode}
% \pkgopt[false]{hypertoc} so add contentsline (if applicable) after
% "\section"
%    \begin{macrocode}
\section*{\@glossaryname}\relax
\ifgls@toc\@glosaddtoc{section}\fi
\fi}%
{%
%    \end{macrocode}
% User has not requested "\section", so use "\chapter"
%    \begin{macrocode}
\ifgls@hypertoc
%    \end{macrocode}
% User has requested \pkgopt[true]{hypertoc}.
% Chapters usually start a new page, so to ensure
% anchor is at the top of the correct page, issue
% a "\clearpage" (or "\cleardoublepage") to place the
% anchor at the correct place.
%    \begin{macrocode}
\@ifundefined{if@twoside}{%
%    \end{macrocode}
% Document class doesn't support twosided documents so
% just do "\clearpage"
%    \begin{macrocode}
\clearpage}{%
\if@twoside
%    \end{macrocode}
% Document is two-sided
% If "\cleardoublepage" is defined, use that
% otherwise just do "\clearpage"
%    \begin{macrocode}
\@ifundefined{cleardoublepage}{\clearpage}{\cleardoublepage}%
\else
%    \end{macrocode}
% One-sided document, just do "\clearpage"
%    \begin{macrocode}
\clearpage
\fi}%
%    \end{macrocode}
% add anchor before "\chapter"
%    \begin{macrocode}
\phantomsection
\@glosaddtoc{chapter}%
\fi
\chapter*{\@glossaryname}\relax
%    \end{macrocode}
% both \pkgopt[true]{hypertoc} and \pkgopt[true]{toc}, so won't get 
% toc entry twice.)
%    \begin{macrocode}
\ifgls@toc\@glosaddtoc{chapter}\fi}}
\markboth{\@shortglossaryname}{\@shortglossaryname}%
}
%    \end{macrocode}
% Now define theglossary environment. Version 2.2: 
% check to see if defined already
%    \begin{macrocode}
\@ifundefined{theglossary}{%
\newenvironment{theglossary}{}{}}{%
\PackageWarning{glossary}{Redefining 'theglossary' environment}}
\renewenvironment{theglossary}{%
\glossarytitle
\glossarypreamble\@bef@reglos}{\@ftergl@s\glossarypostamble}
%    \end{macrocode}
% Provide a means to add text to the beginning or end
% of the glossary.
%    \begin{macrocode}
\newcommand{\glossarypreamble}{}
\newcommand{\glossarypostamble}{}
%    \end{macrocode}
% By default, add the short title to the table of contents.
%    \begin{macrocode}
\newcommand{\@glosaddtoc}[1]{%
\addcontentsline{toc}{#1}{\@shortglossaryname}
}
%    \end{macrocode}
% Set up switch to determine whether the item is the first item in 
% the glossary (in the event that a special case is needed for the 
% first item)
%    \begin{macrocode}
\newif\ifgloitemfirst
\newcommand{\@bef@reglos}{\global\gloitemfirsttrue\beforeglossary}
\newcommand{\@ftergl@s}{\afterglossary\global\gloitemfirstfalse}
%    \end{macrocode}
% Set up defaults.
%    \begin{macrocode}
\newcommand{\glossaryalignment}{\relax}
\newcommand{\@gls@align@glossary}{}
\newcommand{\glosstail}{%
\@ifundefined{@gls@tail@\@glostype}{%
\PackageError{glossary}{No glossary tail defined for glossary
type '\@glostype'}{}}{%
\csname @gls@tail@\@glostype\endcsname}}
\newcommand{\@gls@tail@glossary}{}
\newcommand{\afterglossary}{%
\@ifundefined{@gls@afterglos@\@glostype}{%
\PackageError{glossary}{No after glossary defined for glossary
type '\@glostype'}{}}{%
\csname @gls@afterglos@\@glostype\endcsname}}
\newcommand{\beforeglossary}{%
\@ifundefined{@gls@beforeglos@\@glostype}{%
\PackageError{glossary}{No before glossary defined for glossary
type '\@glostype'}{}}{%
\csname @gls@beforeglos@\@glostype\endcsname}}
\newcommand{\@gls@beforeglos@glossary}{}
\newcommand{\@gls@afterglos@glossary}{}
\newcommand{\@glossary@glodelim}{}
\newcommand{\@glossary@delimT}{}
\newcommand{\glsafternum}{}
\newcommand{\glsbeforenum}{}
\newcommand{\@glossary@gloskip}{}
\newcommand{\@glossary@gloitem}[1]{#1}
%    \end{macrocode}
% Now define what to do depending on which style has been selected.
% First define command to switch to \pkgopt{list} style:
%    \begin{macrocode}
\newcommand{\gls@setlist}[1][glossary]{%
\expandafter\def\csname @gls@beforeglos@#1\endcsname{%
\begin{description}}%
\expandafter\def\csname @gls@afterglos@#1\endcsname{%
\end{description}}%
\expandafter\def\csname @#1@gloskip\endcsname{\indexspace}%
\ifthenelse{\equal{\csname gls@#1@number\endcsname}{none}}{%
\expandafter\def\csname @#1@glodelim\endcsname{}}{%
\expandafter\def\csname @#1@glodelim\endcsname{, }}%
\expandafter\def\csname @#1@gloitem\endcsname##1{\item[##1]}%
\expandafter\def\csname @#1@delimT\endcsname{}
}
%    \end{macrocode}
% Next define command to switch to \pkgopt{altlist} style:
%    \begin{macrocode}
\newcommand{\gls@setaltlist}[1][glossary]{%
\expandafter\def\csname @gls@beforeglos@#1\endcsname{%
\begin{description}}%
\expandafter\def\csname @gls@afterglos@#1\endcsname{%
\end{description}}%
\expandafter\def\csname @#1@gloskip\endcsname{\indexspace}%
\expandafter\def\csname @#1@gloitem\endcsname##1{%
\item[##1]\mbox{}\nopagebreak\par\nopagebreak}%
\expandafter\def\csname @#1@glodelim\endcsname{ }%
\expandafter\def\csname @#1@delimT\endcsname{}
}
%    \end{macrocode}
%Now deal with the other styles.  I orginally used a \envname{tabular} 
% environment, but obviously this doesn't work for a glossary longer 
% than one page (this package started out as a simple example
% accompanying one of my tutorials).  Nick van Foreest recommended 
% the \envname{supertabular} environment.  The \envname{longtable} environment also 
% works, so have both options, and leave it to
% the user.
%    \begin{macrocode}
\ifthenelse{\equal{\gls@style}{super}}{
\IfFileExists{supertab.sty}{\RequirePackage{supertab}}
{\IfFileExists{supertabular.sty}{\RequirePackage{supertabular}}
{\PackageError{glossary}{Option "super" chosen, but can't find 
"supertab" package}{If you want the "super" option, you have to have 
the "supertab" package installed.}}}}
{\RequirePackage{longtable}}
%    \end{macrocode}
% Define new length specifying the width of the description field.
%    \begin{macrocode}
\newlength{\descriptionwidth}
\setlength{\descriptionwidth}{0.6\linewidth}
%    \end{macrocode}
% If user has defined the command \icmdname{glossaryheader}, use it
% otherwise use header as specified by glossary style.
% Added \icmdname{glossarysubheader} in version 2.4. This is provided
% to add a sub heading, or to add a bit of space between
% the header row and the table.
%    \begin{macrocode}
\newcommand{\@glossaryheader}{%
\@ifundefined{glossaryheader}{\csname @\@glostype @header\endcsname}
{\glossaryheader}%
\@ifundefined{glossarysubheader}{}{\glossarysubheader}%
}
%    \end{macrocode}
% Define command to set header style. Added \icmdname{glspageheader} in
% version 2.4. (Third column header)
%    \begin{macrocode}
\newcommand{\gls@setheader}[1][glossary]{%
\ifthenelse{\equal{\gls@header}{none}}%
{%
\ifthenelse{\equal{\gls@border}{none}}
{\expandafter\def\csname @#1@header\endcsname{}%
}{\expandafter\def\csname @#1@header\endcsname{\hline}}%
}{%
\ifnum\gls@cols=2\relax
\ifthenelse{\equal{\gls@border}{none}}
{%
\expandafter\def\csname @#1@header\endcsname{%
\bfseries\entryname & \bfseries \descriptionname\\}}%
{%
\expandafter\def\csname @#1@header\endcsname{%
\hline\bfseries\entryname & \bfseries\descriptionname
\\\hline\hline}}%
\else
\ifthenelse{\equal{\gls@border}{none}}
{%
\expandafter\def\csname @#1@header\endcsname{%
\bfseries\entryname & \bfseries \descriptionname & 
\bfseries \glspageheader \\}}%
{%
\expandafter\def\csname @#1@header\endcsname{%
\hline\bfseries\entryname &\bfseries\descriptionname & 
\bfseries \glspageheader \\\hline\hline}}%
\fi
}}
%    \end{macrocode}
% Define \icmdname{glspageheader} to do nothing, to keep it compatible
% with earlier versions:
%    \begin{macrocode}
\newcommand*{\glspageheader}{}
%    \end{macrocode}
% Define command to set glossary alignment and borders
%    \begin{macrocode}
\newcommand{\gls@setalignment}[1][glossary]{%
\ifthenelse{\equal{\gls@border}{none}}
{
\ifnum\gls@cols=2\relax
\expandafter\def\csname @gls@align@#1\endcsname{%
@{\hspace{\tabcolsep}\bfseries}lp{\descriptionwidth}}
\else
\expandafter\def\csname @gls@align@#1\endcsname{%
@{\hspace{\tabcolsep}\bfseries}lp{\descriptionwidth}l}
\fi
%
\expandafter\def\csname @gls@tail@#1\endcsname{}%
}{%
\ifnum\gls@cols=2\relax
\expandafter\def\csname @gls@align@#1\endcsname{%
|@{\hspace{\tabcolsep}\bfseries
}lp{\descriptionwidth}|}
\else
\expandafter\def\csname @gls@align@#1\endcsname{%
|@{\hspace{\tabcolsep}\bfseries
}lp{\descriptionwidth}l|}
\fi
%
\expandafter\def\csname @gls@tail@#1\endcsname{\hline}%
}%
%
\expandafter\def\csname @#1@delimT\endcsname{\\}
%
\ifnum\gls@cols=2\relax
\expandafter\def\csname @#1@gloskip\endcsname{& \\}%
\ifthenelse{\equal{\csname gls@#1@number\endcsname}{none}}{%
\expandafter\def\csname @#1@glodelim\endcsname{}}{%
\expandafter\def\csname @#1@glodelim\endcsname{, }}%
\else
\expandafter\def\csname @#1@gloskip\endcsname{& & \\}%
\expandafter\def\csname @#1@glodelim\endcsname{& }%
\fi
\expandafter\def\csname @#1@gloitem\endcsname##1{##1 &}%
}
%    \end{macrocode}
% Need a way to avoid conflict with the \styname{array} package. In an 
% earlier version I defined a new column type if the \styname{array}
% package was being used, however this restricts the ability
% to have multiple glossaries with different column alignments.
%    \begin{macrocode}
\newcommand{\@st@rtglostable}[2]{%
\gls@ta={\begin{#1}}\gls@tb=\expandafter{#2}%
\edef\@st@rtglost@ble{\the\gls@ta{\the\gls@tb}}
\@st@rtglost@ble}
%    \end{macrocode}
% Define command to switch to \pkgopt{super} style:
%    \begin{macrocode}
\newcommand{\gls@setsuper}[1][glossary]{%
\gls@setalignment[#1]%
\gls@setheader[#1]%
%
\expandafter\def\csname @gls@beforeglos@#1\endcsname{%
\tablehead{\@glossaryheader}\tabletail{\glosstail}%
\if\glossaryalignment\relax
\expandafter\let\expandafter\@glossaryalignment
\csname @gls@align@#1\endcsname
\else
\let\@glossaryalignment\glossaryalignment
\fi
\@st@rtglostable{supertabular}\@glossaryalignment}
%
\expandafter\def\csname @gls@afterglos@#1\endcsname{%
\end{supertabular}}%
}
%    \end{macrocode}
% Define command to switch to \pkgopt{long} style:
%    \begin{macrocode}
\newcommand{\gls@setlong}[1][glossary]{%
\gls@setalignment[#1]%
\gls@setheader[#1]%
%
\expandafter\def\csname @gls@beforeglos@#1\endcsname{%
\if\relax\glossaryalignment
\expandafter\let\expandafter\@glossaryalignment
\csname @gls@align@#1\endcsname
\else
\let\@glossaryalignment\glossaryalignment
\fi
\@st@rtglostable{longtable}{\@glossaryalignment}
\@glossaryheader\endhead\glosstail\endfoot}
%
\expandafter\def\csname @gls@afterglos@#1\endcsname{%
\end{longtable}}%
}
%    \end{macrocode}
% Define command to set the glossary style.
%    \begin{macrocode}
\newcommand{\@setglossarystyle}[1][glossary]{%
\@ifundefined{gls@set\gls@style}{%
\PackageError{glossary}{Glossary style '\gls@style' undefined}{}}{%
\ifthenelse{\equal{\gls@number}{}}{}{%
\expandafter\edef\csname gls@#1@number\endcsname{\gls@number}%
\@gls@setnumbering[#1]{\gls@number}%
}%
\csname gls@set\gls@style\endcsname[#1]}}
%    \end{macrocode}
% Set main glossary style as per package options
%    \begin{macrocode}
\let\gls@number\gls@glossary@number
\@setglossarystyle
%    \end{macrocode}
% Define keys to change glossary style. The \pkgopt{style} key sets
% the basic style.
%    \begin{macrocode}
\define@key{glosstyle}
{style}
{\ifthenelse{\equal{#1}{list} \or \equal{#1}{altlist} 
\or \equal{#1}{super} \or \equal{#1}{long}}
{\def\gls@style{#1}}
{\PackageError{glossary}
{Unknown glossary style '#1'}
{Available styles are: list, altlist, super and long}}}
%    \end{macrocode}
% The \pkgopt{header} key should only be used in conjunction with
% one of the tabular-type styles. If set to \pkgoptval{plain}{header}, a
% header row will be used.
%    \begin{macrocode}
\define@key{glosstyle}
{header}[plain]{\ifthenelse{\equal{#1}{none} \or \equal{#1}{plain}}
{\def\gls@header{#1}}
{\PackageError{glossary}
{Unknown glossary style '#1'}
{Available styles are: none and plain}}}
%    \end{macrocode}
% The \pkgopt{border} key should only be used in conjunction with one
% of the tabular-type styles. If set to \pkgoptval{plain}{border}, a border will
% be placed around the glossary.
%    \begin{macrocode}
\define@key{glosstyle}
{border}[plain]{\ifthenelse{\equal{#1}{none} \or \equal{#1}{plain}}
{\def\gls@border{#1}}
{\PackageError{glossary}
{Unknown glossary border '#1'}
{Available styles are: none and plain}}}
%    \end{macrocode}
% The \pkgopt{cols} key should only be used in conjunction with one of
% the tabular-type styles. If set to \pkgoptval{2}{cols}, the description and page
% list will both be placed in the second column, if set to \pkgoptval{3}{cols}, 
% the description will go in the second column, and the page list
% will go in the third column.
%    \begin{macrocode}
\define@key{glosstyle}{cols}{\gls@cols=#1\relax
\ifthenelse{\gls@cols<2 \or \gls@cols>3}
{\PackageError{glossary}
{invalid number of columns}
{The cols option can only be 2 or 3}}
{}}
%    \end{macrocode}
% The \pkgopt{number} key may either be \pkgoptval{none}{number} or the name of a counter.
%    \begin{macrocode}
\define@key{glosstyle}
{number}
{\ifthenelse{\equal{#1}{none}}
{\def\gls@number{#1}}
{\@ifundefined{c@#1}{
\PackageError{glossary}
{Unknown glossary number style '#1'}
{You may either specify "none" or the name of a counter,
e.g. "section"}\def\gls@number{page}}{\def\gls@number{#1}}}}
%    \end{macrocode}
% Provide a means of setting the style for a given glossary type.
%    \begin{macrocode}
\newcommand{\setglossarystyle}[2][glossary]{%
\def\gls@number{}%
\setkeys{glosstyle}{#2}%
\@setglossarystyle[#1]%
}
%    \end{macrocode}
% Set the delimiter for the case where there is no numbering
% and there aren't 3 columns.
%    \begin{macrocode}
\ifthenelse{\equal{\gls@glossary@number}{none} \and \gls@cols<3}{%
\renewcommand{\@glossary@glodelim}{}}{}
%    \end{macrocode}
% \subsection{Makeindex style file}
%This is the code to generate the ".ist" file.
% First define a switch that governs whether or not to write the
% ist file.
%    \begin{macrocode}
\newif\ifist
\let\noist=\istfalse
\if@filesw\isttrue\else\istfalse\fi
%    \end{macrocode}
% Provide a command to write the ist file. This will cause
% a problem with \styname{ngerman} because the behaviour
% of the double quote character changes. Any packages that modify
% this character should be loaded after the ".ist" file is written.
%    \begin{macrocode}
\newwrite\istfile
\catcode`\%11\relax
\newcommand{\writeist}{
\protected@write\@auxout{}{\protect\@istfilename{\istfilename}}
\openout\istfile=\istfilename
\write\istfile{% makeindex style file created by LaTeX for document "\jobname" on \the\year-\the\month-\the\day}
\write\istfile{keyword "\string\\glossaryentry"}
\write\istfile{preamble "\string\\begin{theglossary}"}
\write\istfile{postamble "\string\n\string\\end{theglossary}\string\n"}
\write\istfile{group_skip "\string\\gloskip "}
\write\istfile{item_0 "\string\n\string\n\string\\gloitem "}
\write\istfile{delim_0 "\string\n\string\\glodelim "}
\write\istfile{page_compositor "\pagecompositor"}
\write\istfile{delim_n "\string\\delimN "}
\write\istfile{delim_r "\string\\delimR "}
\write\istfile{delim_t "\string\\delimT "}
\write\istfile{headings_flag 1}
\write\istfile{heading_prefix "\string\\glogroup"}
\write\istfile{symhead_positive "Symbols"}
\write\istfile{numhead_positive "Numbers"}
\closeout\istfile
}
\catcode`\%14\relax
%    \end{macrocode}
%Redefine \icmdname{makeglossary} so that it creates the ".ist" file.  
% Once it is created, the \icmdname{ifist} flag is set to false to prevent 
% repeated creation of the file in the event that another 
% glossary-style type is created.  If a different ".ist" file is 
% desired for each glossary type, you will need to precede each 
% "\make"\meta{type} with \icmdname{isttrue} and changed the definition
% of \icmdname{istfilename}.  (This is unlikely to occur unless more than 
% one type of page compositor is required.) If you do this, remember
% to pass the correct ist file to makeindex. I have removed 
% "\@sanitize" at the
% recommendation of Ulrich~Diez.
%    \begin{macrocode}
\renewcommand{\makeglossary}{
\newwrite\@glossaryfile 
\immediate\openout\@glossaryfile=\jobname.glo 
\renewcommand{\glossary}[1][]{\gdef\@glo@l@bel{##1}%
\@bsphack \begingroup \@wrglossary }
\typeout {Writing glossary file \jobname .glo }
\let \makeglossary \@empty
\ifist\writeist\fi
\noist}
%    \end{macrocode}
% The \icmdname{glossary} command has been modified to allow for an optional 
% argument to modify the label. This is the default definition of
% \icmdname{glossary}, it doesn't write anything to the ".glo" file.
% It doesn't use "\setkeys", so "\@sanitize" is used here.
% Use \icmdname{makeglossary} to redefine it so that entries are written
% to the ".glo" file.
%    \begin{macrocode}
\renewcommand{\glossary}[1][]{%
\@bsphack\begingroup\@sanitize\@index}
%    \end{macrocode}
%\subsection{Defining a new glossary type}
% First parameter (optional) is the extension of the log file 
% (information used by "makeglos.pl" but not \LaTeX).
% Second parameter is the name of new glossary type 
% e.g.\ "notation".  Third parameter is the extension of output 
% file (equivalent to "ind" or "glo".  Fourth parameter 
% is the extension of input file (equivalent to "idx" or "gls").
% The fifth parameter (optional) is the format.
%    \begin{macrocode}
\newcommand{\newglossarytype}[4][glg]{
\@ifundefined{#2}{%
\protected@write\@auxout{}{\@newglossarytype[#1]{#2}{#3}{#4}}%
\def\@glstype{#2}\def\@glsout{#3}\def\@glsin{#4}%
\expandafter\edef\csname gls@\@glstype @number\endcsname{%
\gls@glossary@number}%
\expandafter\gdef\csname glsX\@glstype Xnumformat\endcsname{%
\glsXglossaryXnumformat}%
\expandafter\gdef\csname @\@glstype @delimN\endcsname{%
\@glossary@delimN}%
\expandafter\gdef\csname @\@glstype @delimR\endcsname{%
\@glossary@delimR}%
\expandafter\gdef\csname @gls@\@glstype @inext\endcsname{#4}%
\expandafter\def\csname @gls@#2@type\endcsname{#4}%
\expandafter\edef\csname make\@glstype\endcsname{%
\noexpand\@m@kegl@ss{\@glstype}{\@glsout}}
\expandafter\edef\csname \@glstype\endcsname{%
\noexpand\@gl@ss@ary{\@glstype}}
\expandafter\edef\csname x\@glstype\endcsname{%
\noexpand\@Gl@ss@ary{\@glstype}}
\@namedef{print\@glstype}{%
\printglossary[#2]}%
}{\PackageError{glossary}{Command 
\expandafter\string\csname #2\endcsname \space already defined}{%
You can't call your new glossary type '#2' because there already 
exists a command with this name}}%
\@@n@wglostype}
\newcommand{\@@n@wglostype}[1][]{%
\setglossarystyle[\@glstype]{#1}}
%    \end{macrocode}
% The command "\@newglossarytype" is written to the auxiliary file
% and is only used by makeglos.pl. \LaTeX\ should ignore it.
%    \begin{macrocode}
\newcommand{\@newglossarytype}[4][glg]{}
%    \end{macrocode}
% Define equivalent of \icmdname{makeglossary}:
%    \begin{macrocode}
\newcommand\@m@kegl@ss[2]{%
\expandafter\newwrite\csname @#1file\endcsname 
\expandafter\immediate\expandafter
\openout\csname @#1file\endcsname=\jobname.#2 
\typeout {Writing #1 file \jobname .#2 }
\expandafter\let \csname make#1\endcsname \@empty
\ifist\writeist\fi
\expandafter\def\csname the#1num\endcsname{\thepage}
\noist
}
%    \end{macrocode}
% Define the equivalent of \icmdname{glossary}.
%    \begin{macrocode}
\newcommand\@gl@ss@ary[2][]{\@ifundefined{@#2file}{%
\@bsphack\begingroup\@sanitize \@index}{%
\gdef\@glo@l@bel{#1}%
\@bsphack \begingroup \@wrglossary[#2]}}
%    \end{macrocode}
% Define the equivalent of \icmdname{xglossary}.
%    \begin{macrocode}
\newcommand{\@Gl@ss@ary}{%
\renewcommand{\@@wrglossary}[1]{%
\glossref{\@glo@l@bel}{##1}\renewcommand{\@@wrglossary}{}}%
\@gl@ss@ary}
%    \end{macrocode}
% The command \icmdname{newglossarytype} should only be used in the preamble.
%    \begin{macrocode}
\@onlypreamble{\newglossarytype}
%    \end{macrocode}
%\subsection{Acronyms}
% Define \icmdname{newacronym}[\meta{cmd-name}]\{\meta{abbrv}\}\{\meta{long name}\}\{\meta{glos entry}\}
%    \begin{macrocode}
\newcommand\@acrnmsh{}
\newcommand\@sacrnmsh{}
\newcommand\@acrnmln{}
\newcommand\@acrnmcmd{}
\newcommand\@acrnmgls{}
\newcommand\@acrnmins{}
%    \end{macrocode}
% List of all defined acronyms.
%    \begin{macrocode}
\toksdef\@glo@tb=2
\newcommand{\@acr@list}{}
%    \end{macrocode}
% append acronym to list
%    \begin{macrocode}
\newcommand{\@acr@addtolist}[1]{\edef\@glo@ta{#1}%
\ifthenelse{\equal{\@acr@list}{}}{%
\edef\@acr@list{\@glo@ta}}{%
\@glo@tb=\expandafter{\@acr@list}%
\edef\@acr@list{\the\@glo@tb,\@glo@ta}}}
%    \end{macrocode}
% Specify how to control the way the name key is 
% set for acronyms.
%    \begin{macrocode}
\newcommand{\@acronymnamefmt}{\glolong\ (\gloshort)}
\newcommand{\setacronymnamefmt}[1]{\def\@acronymnamefmt{#1}}
%    \end{macrocode}
% Specify how to control the way the description key is 
% set for acronyms.
%    \begin{macrocode}
\newcommand{\@acronymdescfmt}{\glodesc}
\newcommand{\setacronymdescfmt}[1]{\def\@acronymdescfmt{#1}}
%    \end{macrocode}
% Format the acronym abbreviation in the format specified
% by \verb'\acronymfont'. This simply prints its
% argument by default.
%    \begin{macrocode}
\newcommand{\acronymfont}[1]{#1}
%    \end{macrocode}
% This command has been restructured as from v2.17
%    \begin{macrocode}
\newcommand{\newacronym}[4][]{%
\ifthenelse{\equal{#1}{}}{\renewcommand\@acrnmcmd{#2}}{%
\renewcommand\@acrnmcmd{#1}}
\@ifundefined{\@acrnmcmd}{%
\expandafter\newcommand\csname\@acrnmcmd short\endcsname{%
#2\protect\glsxspace}
\expandafter\newcommand\csname\@acrnmcmd @nx@short\endcsname{#2}
\expandafter\newcommand\csname\@acrnmcmd long\endcsname{%
#3\protect\glsxspace}
\expandafter\newcommand\csname\@acrnmcmd @nx@long\endcsname{#3}
\def\@acrn@entry{#4}%
{%
% extract description
\expandafter\@gls@getdescr\expandafter{\@acrn@entry}%
\let\glodesc\@glo@desc%
\def\glolong{#3}%
\@onelevel@sanitize\glolong
\def\gloshort{\noexpand\acronymfont{#2}}%
\@onelevel@sanitize\gloshort
\expandafter\protected@xdef\expandafter\@acrnamefmt{\@acronymnamefmt}
\expandafter\protected@xdef\expandafter\@acrdesc{\@acronymdescfmt}
}%
\@acr@addtolist{\@acrnmcmd}
\@glo@tb=\expandafter{\@acrn@entry}%
\protected@edef\@acr@glsentry{name={\@acrnamefmt},%
format=glsnumformat,sort={\@acrnmcmd},\the\@glo@tb,%
description={\@acrdesc}}%
\@glo@tb=\expandafter{\@acr@glsentry}%
\newboolean{\@acrnmcmd first}\setboolean{\@acrnmcmd first}{true}
\expandafter\protected@edef\csname \@acrnmcmd\endcsname{%
\noexpand\@ifstar{\csname @s@\@acrnmcmd\endcsname}{%
\csname @\@acrnmcmd\endcsname}}
\ifglshyperacronym % hyperlinks
% unstarred version
\expandafter\protected@edef\csname @\@acrnmcmd\endcsname{%
\noexpand\ifthenelse{\noexpand\boolean{\@acrnmcmd first}}{%
\csname\@acrnmcmd @nx@long\endcsname\noexpand\@acrnmins\ 
(\noexpand\xacronym{\the\@glo@tb}{%
\noexpand\acronymfont{\csname\@acrnmcmd @nx@short\endcsname}%
})\noexpand\unsetacronym{\@acrnmcmd}%
}{\noexpand\xacronym{\the\@glo@tb}{%
\noexpand\acronymfont{\csname\@acrnmcmd @nx@short\endcsname}%
\noexpand\@acrnmins}}\noexpand\glsxspace}
% starred version
\expandafter\protected@edef\csname @s@\@acrnmcmd\endcsname{%
\noexpand\ifthenelse{\noexpand\boolean{\@acrnmcmd first}}{%
\noexpand\expandafter\noexpand\MakeUppercase
\csname\@acrnmcmd @nx@long\endcsname\noexpand\@acrnmins\ 
(\noexpand\xacronym{\the\@glo@tb}{%
\noexpand\acronymfont{\csname\@acrnmcmd @nx@short\endcsname}%
})%
\noexpand\unsetacronym{\@acrnmcmd}}{%
\noexpand\xacronym{\the\@glo@tb}{%
\noexpand\acronymfont{\noexpand\expandafter\noexpand\MakeUppercase
\csname\@acrnmcmd @nx@short\endcsname}%
\noexpand\@acrnmins}}\noexpand\glsxspace}
\else % no hyperlinks
% unstarred version
\expandafter\protected@edef\csname @\@acrnmcmd\endcsname{%
\noexpand\ifthenelse{\noexpand\boolean{\@acrnmcmd first}}{%
\csname\@acrnmcmd @nx@long\endcsname\noexpand\@acrnmins\ 
(\noexpand\acronym{\the\@glo@tb}{%
\noexpand\acronymfont{\csname\@acrnmcmd @nx@short\endcsname}%
})\noexpand\unsetacronym{\@acrnmcmd}%
}{\noexpand\acronym{\the\@glo@tb}{%
\noexpand\acronymfont{\csname\@acrnmcmd @nx@short\endcsname}%
\noexpand\@acrnmins}}%
\noexpand\glsxspace}
% starred version
\expandafter\protected@edef\csname @s@\@acrnmcmd\endcsname{%
\noexpand\ifthenelse{\noexpand\boolean{\@acrnmcmd first}}{%
\noexpand\expandafter
\noexpand\MakeUppercase
\csname\@acrnmcmd @nx@long\endcsname\noexpand\@acrnmins\ 
(\noexpand\acronym{\the\@glo@tb}{%
\noexpand\acronymfont{\csname\@acrnmcmd @nx@short\endcsname}%
})%
\noexpand\unsetacronym{\@acrnmcmd}}{%
\noexpand\acronym{\the\@glo@tb}{%
\noexpand\acronymfont{\noexpand\expandafter\noexpand\MakeUppercase
\csname\@acrnmcmd @nx@short\endcsname}%
\noexpand\@acrnmins}}\noexpand\glsxspace}
\fi
}{%
\PackageError{glossary}{Command '\expandafter\string
\csname\@acrnmcmd\endcsname' already defined}{%
The command name specified by \string\newacronym already exists.}}}
%    \end{macrocode}
% Define a command to use a given acronym.
%    \begin{macrocode}
\newcommand{\useacronym}{\@ifstar\@suseacronym\@useacronym}
\newcommand{\@suseacronym}[2][]{{\let\glsxspace\relax
\def\@acrnmins{#1}\csname @s@#2\endcsname}%
\setboolean{#2first}{false}}
\newcommand{\@useacronym}[2][]{{\let\glsxspace\relax
\def\@acrnmins{#1}\csname @#2\endcsname}%
\setboolean{#2first}{false}}
%    \end{macrocode}
% Define a command to use the long form of an acronym without
% generating a glossary entry. The starred form makes the first
% character uppercase.
%    \begin{macrocode}
\newcommand{\acrln}{\@ifstar\@sacrln\@acrln}
%    \end{macrocode}
% Unstarred form:
%    \begin{macrocode}
\newcommand{\@acrln}[1]{\@ifundefined{#1long}{%
\PackageError{glossary}{Acronym '#1' has not been defined}{}}{%
\csname#1@nx@long\endcsname}}
%    \end{macrocode}
% Starred form:
%    \begin{macrocode}
\newcommand{\@sacrln}[1]{\@ifundefined{#1long}{%
\PackageError{glossary}{Acronym '#1' has not been defined}{}}{%
\expandafter\expandafter\expandafter
\MakeUppercase\csname#1@nx@long\endcsname}}
%    \end{macrocode}
% As above, but for the short form.
%    \begin{macrocode}
\newcommand{\acrsh}{\@ifstar\@sacrsh\@acrsh}
%    \end{macrocode}
% Unstarred form:
%    \begin{macrocode}
\newcommand{\@acrsh}[1]{\@ifundefined{#1short}{%
\PackageError{glossary}{Acronym '#1' has not been defined}{}}{%
\acronymfont{\csname#1@nx@short\endcsname}}}
%    \end{macrocode}
% Starred form:
%    \begin{macrocode}
\newcommand{\@sacrsh}[1]{\@ifundefined{#1short}{%
\PackageError{glossary}{Acronym '#1' has not been defined}{}}{%
\acronymfont{\expandafter\expandafter\expandafter
\MakeUppercase\csname#1@nx@short\endcsname}}}
%    \end{macrocode}
% Define a means of determining whether an acronym has been 
% used or not. This was mainly included for use with LaTeX2HTML
% which currently has no \styname{ifthen} style.
%    \begin{macrocode}
\newcommand{\ifacronymfirstuse}[3]{%
\@ifundefined{if#1first}{%
\PackageError{glossary}{Acronym '#1' not defined}{}}{%
\ifthenelse{\boolean{#1first}}{#2}{#3}}}
%    \end{macrocode}
% Provide a means of resetting an acronym so that it is expanded
% next time it is used.
%    \begin{macrocode}
\newcommand{\resetacronym}[1]{%
\@ifundefined{if#1first}{%
\PackageError{glossary}{Acronym '#1' not defined}{}}{%
\ifglsglobal
\expandafter\global\csname #1firsttrue\endcsname
\else
\setboolean{#1first}{true}%
\fi}}
%    \end{macrocode}
% Reverse of the above.
%    \begin{macrocode}
\newcommand{\unsetacronym}[1]{%
\@ifundefined{if#1first}{%
\PackageError{glossary}{Acronym '#1' not defined}{}}{%
\ifglsglobal
\expandafter\global\csname #1firstfalse\endcsname
\else
\setboolean{#1first}{false}%
\fi}}
%    \end{macrocode}
% Reset all acronyms so that they will all be expanded when next
% used.
%    \begin{macrocode}
\newcommand{\resetallacronyms}{%
\@for\@acr:=\@acr@list\do{\resetacronym{\@acr}}}
%    \end{macrocode}
% Ensure that all acronyms are not expanded, even if they haven't
% yet been used.
%    \begin{macrocode}
\newcommand{\unsetallacronyms}{%
\@for\@acr:=\@acr@list\do{\unsetacronym{\@acr}}}
%    \end{macrocode}
% Check to see if acronyms should be separate from glossary
%    \begin{macrocode}
\ifglsacronym
\newglossarytype[alg]{acronym}{acr}{acn}
\providecommand{\acronymname}{List of Acronyms}
\else
\let\acronym=\glossary
\let\xacronym=\xglossary
\fi
%    \end{macrocode}
%\subsection{Glossary Hyperlinks}
% This section deals with commands that are used to make the
% numbers in the glossary have hyperlinks, if hyperlinks are
% supported.
%
% The command \icmdname{glshyper} is a modification of \styname{hyperref}'s
% \icmdname{hyperpage} command, but it uses \icmdname{delimR} instead of a dash, and 
% \icmdname{delimN} instead of a comma. The command was originally called
% \icmdname{glshyperpage} but was modified in version 2.4 to 
% enable "page" to be substituted with some arbitrary counter
% (which should be specified as the first argument).
%    \begin{macrocode}
\ifglshyper
\def\glshyper#1#2{\@glshyper{#1}#2\delimR \delimR \\}
\def\@glshyper#1#2\delimR #3\delimR #4\\{%
\ifx\\#3\\%
\@delimNhyper{#1}{#2}%
\else
\@ifundefined{hyperlink}{#2\delimR #3}{%
\hyperlink{#1.#2}{#2}\delimR \hyperlink{#1.#3}{#3}}%
\fi
}
%    \end{macrocode}
% For a list of individual pages instead of a range:
%    \begin{macrocode}
\def\@delimNhyper#1#2{\@@delimNhyper{#1}#2\delimN \delimN\\}
\def\@@delimNhyper#1#2\delimN #3\delimN #4\\{%
  \ifx\\#3\\%
    \@ifundefined{hyperlink}{#2}{\hyperlink{#1.#2}{#2}}%
  \else
    \@ifundefined{hyperlink}{#2\delimN #3}{%
\hyperlink{#1.#2}{#2}\delimN \hyperlink{#1.#3}{#3}}%
  \fi
}
%    \end{macrocode}
% To maintain backwards compatibility, define \icmdname{glshyperpage}
% and \icmdname{glshypersection}. These commands may be removed at a 
% later date, so don't use them.
%    \begin{macrocode}
\newcommand\glshyperpage[1]{\glshyper{page}{#1}}
\newcommand\glshypersection[1]{\glshyper{section}{#1}}
%    \end{macrocode}
% If chapters are defined, modify "\@chapter" so that is adds
% a "section."\meta{n}".0" target (otherwise it gets too complicated
% if you have to work out whether to use the chapter or section
% counter---there's more than enough conditional code in this 
% package already!)
%    \begin{macrocode}
\@ifundefined{chapter}
{}
{\let\@gls@old@chapter\@chapter
\def\@chapter[#1]#2{\@gls@old@chapter[{#1}]{#2}%
\@ifundefined{hyperdef}{}{\hyperdef{section}{\thesection}{}}}}
%    \end{macrocode}
% Provide "\hyper"\meta{xx} to make it easier to change the page 
% number format to "bf", "sf", "tt" and "it" if you are using 
% hyperlinks.
% The optional first argument (new to version 2.4) specifies
% the counter being used.
%    \begin{macrocode}
\providecommand\hyperrm[2][\gls@number]{%
\textrm{\glshyper{#1}{#2}}}
\providecommand\hypersf[2][\gls@number]{%
\textsf{\glshyper{#1}{#2}}}
\providecommand\hypertt[2][\gls@number]{%
\texttt{\glshyper{#1}{#2}}}
\providecommand\hyperbf[2][\gls@number]{%
\textbf{\glshyper{#1}{#2}}}
\providecommand\hyperit[2][\gls@number]{%
\textit{\glshyper{#1}{#2}}}
%    \end{macrocode}
% The following were added in version 2.4:
%    \begin{macrocode}
\providecommand\hyperem[2][\gls@number]{%
\emph{\glshyper{#1}{#2}}}
\providecommand\hyperup[2][\gls@number]{%
\textup{\glshyper{#1}{#2}}}
\providecommand\hypersl[2][\gls@number]{%
\textsl{\glshyper{#1}{#2}}}
\providecommand\hypersc[2][\gls@number]{%
\textsc{\glshyper{#1}{#2}}}
\providecommand\hypermd[2][\gls@number]{%
\textmd{\glshyper{#1}{#2}}}
%    \end{macrocode}
% Hyperlinks not enabled.
%    \begin{macrocode}
\else
\providecommand\hyperrm[2][]{\textrm{#2}}
\providecommand\hypersf[2][]{\textsf{#2}}
\providecommand\hypertt[2][]{\texttt{#2}}
\providecommand\hypermd[2][]{\textmd{#2}}
\providecommand\hyperbf[2][]{\textbf{#2}}
\providecommand\hyperit[2][]{\textit{#2}}
\providecommand\hypersl[2][]{\textsl{#2}}
\providecommand\hyperup[2][]{\textup{#2}}
\providecommand\hypersc[2][]{\textsc{#2}}
\providecommand\hyperem[2][]{\emph{#2}}
\fi
%    \end{macrocode}
%\iffalse
%\subsection{Additional Files}
% The remainder of this document simply lists the contents
% of all the additional files that accompany the \styname{glossary}
% package. There is no further documentation. Some lines may not
% fit on the page. If you like, you can comment out this section
% using "\iffalse" and "\fi".
%    \begin{macrocode}
%</glossary.sty>
%    \end{macrocode}
%    \begin{macrocode}
%<*makeglos.pl>
%    \end{macrocode}
%    \begin{macrocode}
#!/usr/bin/perl

# File    : makeglos 
# Author  : Nicola Talbot
# Version : 1.5 (2006/07/20)
# Description: simple Perl script that calls makeindex.
# Intended for use with "glossary.sty" (saves having to remember 
# all the various switches)

use Getopt::Std;

if ($#ARGV < 0)
{
   die "Syntax : $0 [-ilqrcgm] [-s sty] [-o gls] [-t log] [-p num] <filename>\n";
}

getopt('sotp');
getopts('ilqrcgm');

# define known extensions

 %exttype = (
   glossary => {in=>'glo', out=>'gls', 'log'=>'glg'},
 );

$ext = '';

if (length(@ARGV[0]) < 4)
{
   $name = @ARGV[0];
}
elsif (substr(@ARGV[0],-4,1) eq ".")
{
  $name = substr(@ARGV[0],0,length(@ARGV[0])-4);

  $ext = substr(@ARGV[0],-3,3);
}
else
{
   $name = @ARGV[0];
}

$istfile = "$name.ist";

# check log file for other glossary types
# and for ist file name

if (open AUXFILE, "$name.aux")
{
   while (<AUXFILE>)
   {
      if (m/\\\@newglossarytype\s*\[(.*)\]{(.*)}{(.*)}{(.*)}/)
      {
         $exttype{$2}{'in'}  = $3;
         $exttype{$2}{'out'} = $4;
         $exttype{$2}{'log'} = $1;

         if (!$opt_q)
         {
            print "added glossary type '$2' ($3,$4,$1)\n";
         }
      }

      if (m/\\\@istfilename\s*{([^}]*)}/)
      {
         $istfile = $1;
      }
   }

   close AUXFILE;
}
else
{
   print "unable to open $name.aux\n";
}

# save all the general makeindex switches

$mkidxopts = '';

if ($opt_i)
{
   $mkidxopts .= " -i";
}

if ($opt_l)
{
   $mkidxopts .= " -l";
}

if ($opt_q)
{
   $mkidxopts .= " -q";
}

if ($opt_r)
{
   $mkidxopts .= " -r";
}

if ($opt_c)
{
   $mkidxopts .= " -c";
}

if ($opt_g)
{
   $mkidxopts .= " -g";
}

unless ($opt_p eq "")
{
   $mkidxopts .= " -p $opt_p";
}

unless ($opt_s eq "")
{
   $istfile = $opt_s;
}

if ($ext ne '')
{
   %thistype = %{$exttype{'glossary'}}; #default

   foreach $type (keys %exttype)
   {
      if ($exttype{$type}{'in'} eq $ext)
      {
         %thistype = %{$exttype{$type}};

         last;
      }
   }

   if ($opt_o eq "")
   {
      $outfile = "$name.$thistype{out}";
   }
   else
   {
      $outfile = $opt_o;
   }

   if ($opt_t eq "")
   {
      $transcript = "$name.$thistype{'log'}";
   }
   else
   {
      $transcript = $opt_t;
   }

   &makeindex("$name.$ext",$outfile,$transcript,$istfile,
              $mkidxopts,$opt_q,$opt_m);
}
else
{
   foreach $type (keys %exttype)
   {
      %thistype = %{$exttype{$type}};

      $inputfile = "$name.$thistype{in}";

      if (-r $inputfile)
      {
         if ($opt_o eq "")
         {
            $outfile = "$name.$thistype{out}";
         }
         else
         {
            $outfile = $opt_o;
         }

         if ($opt_t eq "")
         {
            $transcript = "$name.$thistype{'log'}";
         }
         else
         {
           $transcript = $opt_t;
         }

         &makeindex($inputfile,$outfile,$transcript,
                    $istfile,$mkidxopts,$opt_q,$opt_m);
      }
      elsif (!$opt_q)
      {
         print "no read access for '$inputfile'\n";
      }
   }
}

sub makeindex{
   local($in,$out,$trans,$ist,$rest,$quiet,$merge) = @_;
   local($name,$cmdstr,$buffer,$n,$i,$j);
   local(@stuff,@item);

   if ($merge)
   {
      $cmdstr = "$rest -s $ist -t $trans -o tmp_$out $in";
   }
   else
   {
      $cmdstr = "$rest -s $ist -t $trans -o $out $in";
   }

   unless ($quiet)
   {
      print "makeindex $cmdstr\n";
   }

   `makeindex $cmdstr`;

   if ($merge)
   {
      print "Merging entries\n";

      open INPUT, "<tmp_$out";

      $buffer = "";

      while (<INPUT>)
      {
         $buffer .= $_;
      }

      close INPUT;

      open OUTPUT, ">$out";

      @stuff = split /\\gloitem /, $buffer;

      $n = scalar(@stuff);

      if ($n < 2)
      {
         print OUTPUT $buffer;
      }
      else
      {
         print OUTPUT $stuff[0];

         for ($i = 1, $j=-1; $i < $n; $i++)
         {
            if ($stuff[$i]=~s/{\\glosslabel{(.+)}{(.+)}}//)
            {
               $name = $&;

               if ($j==-1)
               {
                  $j = 0;
                  $item[0]{'name'} = $name;
                  $item[0]{'desc'} = $stuff[$i];
               }
               else
               {
                  # makeindex has already sorted the entries
                  # alphabetically, so duplicate entries
                  # will be one after the other

                  if ($item[$j]{'name'} eq $name)
                  {
                     $item[$j]{'desc'} .= $stuff[$i];

                     print "collating $name\n";
                  }
                  else
                  {
                     $j++;
                     $item[$j]{'name'} = $name;
                     $item[$j]{'desc'} = $stuff[$i];
                  }
               }
            }
            else
            {
               print STDERR 
                     "unable to extract name from glossary item:\n",
                      $stuff[$i];
            }
         }

         for ($i=0; $i <= $j; $i++)
         {
            # remove all but the last \delimT
            while ($item[$i]{'desc'}=~s/\\delimT/$&/sg > 1)
            {
               $item[$i]{'desc'}=~s/\\delimT//s;
            }
            print OUTPUT "\\gloitem ", $item[$i]{'name'},
                        $item[$i]{'desc'};
         }
      }

      close OUTPUT;

      print "Output written in $out\n";

      unlink "tmp_$out" or print "Can't delete tmp_$out: $!\n"; 
   }
}

1;
%    \end{macrocode}
%    \begin{macrocode}
%</makeglos.pl>
%    \end{macrocode}
%    \begin{macrocode}
%<*makeglos.bat>
%    \end{macrocode}
%    \begin{macrocode}
@rem = '-*- Perl -*-
@echo off
perl -S %~dp0makeglos.pl %*
%    \end{macrocode}
%    \begin{macrocode}
%</makeglos.bat>
%    \end{macrocode}
%    \begin{macrocode}
%<*glossary.perl>
%    \end{macrocode}
%    \begin{macrocode}
# File        : glossary.perl
# Author      : Nicola Talbot
# Date        : 5 December 2005
# Version     : 1.03
# Description : LaTeX2HTML implementation of glossary package.

package main;

# These are the only package options implemented.

sub do_glossary_style_altlist{
}

sub do_glossary_style_hyper{
}

sub do_glossary_style_hyper_true{
}

sub do_glossary_style_hyperacronym{
}

sub do_glossary_style_hyperacronym_true{
}

sub do_glossary_toc{
}

sub do_glossary_toc_true{
}

$acronymtype = 'glossary';

sub do_glossary_acronym{
   &do_glossary_acronym_true
}

sub do_glossary_acronym_true{
   $gls_mark{'acronym'} = "<tex2html_acronym_mark>";
   $gls_file_mark{'acronym'} = "<tex2html_acronym_file_mark>";
   $gls_title{'acronym'} = "\\acronymname";
   $delimN{'acronym'} = ", ";
   $glodelim{'acronym'} = " ";
   $glsnumformat{'acronym'} = "textrm";
   $acronymtype = 'acronym';
}

sub do_glossary_acronym_false{
   $acronymtype = 'glossary';
}

sub do_cmd_acronymname{
   join('', 'List of Acronyms', $_[0]);
}

# modify set_depth_levels so that glossary is added

$gls_mark{'glossary'} = "<tex2html_gls_mark>";
$gls_file_mark{'glossary'} = "<tex2html_gls_file_mark>";
$gls_title{'glossary'} = "Glossary";
$delimN{'glossary'} = ", ";
$glodelim{'glossary'} = " ";
$glsnumformat{'glossary'} = "textrm";

sub replace_glossary_markers{
   foreach $type (keys %gls_mark)
   {
      if (defined &add_gls_hook)
        {&add_gls_hook if (/$gls_mark{$type}/);}
      else
        {&add_gls($type) if (/$gls_mark{$type}/);}

      s/$gls_file_mark{$type}/$glsfile{$type}/g;
   }
}

# there must be a better way of doing this
# other than copying the orginal code and adding to it.
sub replace_general_markers {
    if (defined &replace_infopage_hook) {&replace_infopage_hook if (/$info_page_mark/);}
    else { &replace_infopage if (/$info_page_mark/); }
    if (defined &add_idx_hook) {&add_idx_hook if (/$idx_mark/);}
    else {&add_idx if (/$idx_mark/);}
    &replace_glossary_markers;

    if ($segment_figure_captions) {
s/$lof_mark/$segment_figure_captions/o
    } else { s/$lof_mark/$figure_captions/o }
    if ($segment_table_captions) {
s/$lot_mark/$segment_table_captions/o
    } else { s/$lot_mark/$table_captions/o }
    &replace_morelinks();
    if (defined &replace_citations_hook) {&replace_citations_hook if /$bbl_mark/;}
    else {&replace_bbl_marks if /$bbl_mark/;}
    if (defined &add_toc_hook) {&add_toc_hook if (/$toc_mark/);}
    else {&add_toc if (/$toc_mark/);}
    if (defined &add_childs_hook) {&add_childs_hook if (/$childlinks_on_mark/);}
    else {&add_childlinks if (/$childlinks_on_mark/);}
    &remove_child_marks;

    if (defined &replace_cross_references_hook) {&replace_cross_references_hook;}
    else {&replace_cross_ref_marks if /$cross_ref_mark||$cross_ref_visible_mark/;}
    if (defined &replace_external_references_hook) {&replace_external_references_hook;}
    else {&replace_external_ref_marks if /$external_ref_mark/;}
    if (defined &replace_cite_references_hook) {&replace_cite_references_hook;}
    else { &replace_cite_marks if /$cite_mark/; }
    if (defined &replace_user_references) {
  &replace_user_references if /$user_ref_mark/; }

}

sub add_gls{
    local($sidx_style, $eidx_style) =('<STRONG>','</STRONG>');
    if ($INDEX_STYLES) {
if ($INDEX_STYLES =~/,/) {
local(@styles) = split(/\s*,\s*/,$INDEX_STYLES);
    $sidx_style = join('','<', join('><',@styles) ,'>');
    $eidx_style = join('','</', join('></',reverse(@styles)) ,'>');
} else {
    $sidx_style = join('','<', $INDEX_STYLES,'>');
    $eidx_style = join('','</', $INDEX_STYLES,'>');
}
    }
    &add_real_gls
}

sub gloskeysort{
   local($x, $y) = ($a, $b);
   $x=~s/^(.*)###(\d+)$/\l\1/;
   local($x_id) = $2;
   $y=~s/^(.*)###(\d+)$/\l\1/;
   local($y_id) = $2;

   local($n) = ($x cmp $y);

   if ($n == 0)
   {
      $n = ($x_id <=> $y_id);
   }

   $n;
}

sub add_real_gls{
    local($type) = @_;
    print "\nDoing the $type ...";
    local($key, $str, @keys, $glossary, $level, $count,
  @previous, @current, $id, $linktext, $delimN);

    @keys = keys %{$glossary{$type}};

    @keys = sort gloskeysort @keys;

    $level = 0;

    $delimN = $delimN{$type};

    foreach $key (@keys) {
        $current = $key;
$str = $current;
$str =~ s/\#\#\#\d+$//o; # Remove the unique id's
        #$linktext = $cross_ref_visible_mark;
        $id = ++$global{'max_id'};
        $linktext = "\\$glossary_format{$type}{$key}${OP}$id${CP}$glossary_linktext{$type}{$key}${OP}$id${CP}";
        $linktext = &translate_commands($linktext);
$glossary .=
    # If it's the same string don't start a new line
    (&index_key_eq($current, $previous) ?
               $delimN
               . $glossary{$type}{$key}
               . $linktext
               . "</A>\n"
            : "<DT>"
                   . $glossary_name{$type}{$key}
                   . "<DD>". $glossary_desc{$type}{$key}
                   . $glodelim{$type} . $glossary{$type}{$key}
     . $linktext. "</A>\n");
$previous = $current;
    }
    $glossary = '<DD>'.$glossary unless ($glossary =~ /^\s*<D(T|D)>/);

    $glossary =~ s/(<A [^>]*>)(<D(T|D)>)/$2$1/g;

    $str = &translate_commands("\\glossarypostamble");
    s/$gls_mark{$type}/$preglossary\n<DL COMPACT>\n$glossary<\/DL>$str\n/s;
}

sub set_depth_levels {
    # Sets $outermost_level
    local($level);
    # scan the document body, not the preamble, for use of sectioning commands
    my ($contents) = $_;
    if ($contents =~ /\\begin\s*((?:$O|$OP)\d+(?:$C|$CP))document\1|\\startdocument/s) {
$contents = $';
    }
    foreach $level ("part", "chapter", "section", "subsection",
    "subsubsection", "paragraph") {
last if (($outermost_level) = $contents =~ /\\($level)$delimiter_rx/);
last if (($outermost_level) = $contents =~ /\\endsegment\s*\[\s*($level)\s*\]/s);
if ($contents =~ /\\segment\s*($O\d+$C)[^<]+\1\s*($O\d+$C)\s*($level)\s*\2/s)
{ $outermost_level = $3; last };
    }
    $level = ($outermost_level ? $section_commands{$outermost_level} :
      do {$outermost_level = 'section'; 3;});

    if ($REL_DEPTH && $MAX_SPLIT_DEPTH) {
$MAX_SPLIT_DEPTH = $level + $MAX_SPLIT_DEPTH;
    } elsif (!($MAX_SPLIT_DEPTH)) { $MAX_SPLIT_DEPTH = 1 };

    %unnumbered_section_commands = (
          'tableofcontents', $level
, 'listoffigures', $level
, 'listoftables', $level
, 'bibliography', $level
, 'textohtmlindex', $level
, 'textohtmlglossary', $level
        , %unnumbered_section_commands
        );

    %section_commands = (
  %unnumbered_section_commands
        , %section_commands
        );
}

sub add_bbl_and_idx_dummy_commands {
    local($id) = $global{'max_id'};

    s/([\\]begin\s*$O\d+$C\s*thebibliography)/$bbl_cnt++; $1/eg;
    ## if ($bbl_cnt == 1) {
s/([\\]begin\s*$O\d+$C\s*thebibliography)/$id++; "\\bibliography$O$id$C$O$id$C $1"/geo;
    #}
    $global{'max_id'} = $id;
    s/([\\]begin\s*$O\d+$C\s*theindex)/\\textohtmlindex $1/o;
    s/[\\]printindex/\\textohtmlindex /o;
    &add_gls_dummy_commands;
    &lib_add_bbl_and_idx_dummy_commands() if defined(&lib_add_bbl_and_idx_dummy_commands);
}

# this gets called before do_cmd_newglossarytype
# so currently only substitutes \\printglossary and \\printacronym
sub add_gls_dummy_commands{
   #foreach $type (keys %gls_mark)
   #{
   #   #$id = ++$global{'max_id'};
   #   s/[\\]print$type/\\textohtmlglossary[$type]/sg;
   #}

   s/[\\]printglossary/\\textohtmlglossary/sg;
   s/[\\]printacronym/\\textohtmlglossary[$acronymtype]/sg;
}

# This is modified from do_cmd_textohtmlindex

sub do_cmd_textohtmlglossary{
   local($_) = @_;

   local($type);

   $_[0]=~s/^\s*\[([^]]*)\]//;
   $type = $1;
   if ($type eq '') {$type = 'glossary';}

   unless (defined $gls_mark{$type})
   {
      &write_warnings("glossary type '$type' not implemented");
   }

   if (eval "(defined \&do_cmd_${type}name) ||\$new_command{\"${type}name\"}")
   {
      local($br_id)=++$global{'max_id'};
      $TITLE = &translate_environments("$O$br_id$C\\${type}name$O$br_id$C");
   }
   else
   { $TITLE = $gls_title{$type} }
   $toc_sec_title = $TITLE;
   $glsfile{$type} = $CURRENT_FILE;
   if (%glossary_labels) { &make_glossary_labels(); }
   if (($SHORT_INDEX) && (%glossary_segment))
   { &make_preglossary(); }
   else
   { $preglossary = &translate_commands("\\glossarypreamble"); }
   local $idx_head = $section_headings{'textohtmlindex'};
   local($heading) = join(''
        , &make_section_heading($TITLE, $idx_head)
        , $gls_mark{$type} );
   local($pre,$post) = &minimize_open_tags($heading);
   join('',"<BR>\n" , $pre, $_[0]);
}

sub make_glossary_labels {
    local($key, @keys);
    @keys = keys %glossary_labels;
    foreach $key (@keys) {
        if (($ref_files{$key}) && !($ref_files{$key} eq "$glsfile{'glossary'}")) {
            local($tmp) = $ref_files{$key};
            &write_warnings("\nmultiple label $key , target in $glsfile{'glossary'} masks $tmp ");
        }
        $ref_files{$key} .= $glsfile{'glossary'};
    }
}

sub make_preglossary{ &make_real_preglossary }
sub make_real_preglossary{
    local($key, @keys, $head, $body);
    $head = "<HR>\n<H4>Legend:</H4>\n<DL COMPACT>";
    @keys = keys %glossary_segment;
    foreach $key (@keys) {
        local($tmp) = "segment$key";
        $tmp = $ref_files{$tmp};
        $body .= "\n<DT>$key<DD>".&make_named_href('',$tmp,$glossary_segment{$key});
    }
    $preglossary = join('', $head, $body, "\n</DL>") if ($body);
}

sub do_cmd_glossary { &do_real_glossary(@_) }
sub do_real_glossary {
    local($_) = @_;
    local($br_id, $str);
    local($type) = "glossary";
    local($anchor);

    if (s/^\S*$OP(\d+)${CP}type=(.+)$OP\1$CP//)
    {
       $type = $2;
    }

    local($idx_option,$pat) = &get_next_optional_argument;

    $str = &missing_braces unless (
(s/$next_pair_pr_rx/($br_id, $str) = ($1, $2);''/eo)
||(s/$next_pair_rx/($br_id, $str) = ($1, $2);''/eo));

    # the maths gets processed before being passed
    # to do_cmd_glossary.  How can I do this
    # substitution before it gets converted to an image?
    $str=~s/\"\"/\"/gs;
    $str=~s/\"\|/\|/gs;
    $str=~s/\"@/@/gs;
    $str=~s/\"!/!/gs;

    $str=~s/;SPMquot;;SPMquot;/;SPMquot;/gs;
    $str=~s/;SPMquot;\|/\|/gs;
    $str=~s/;SPMquot;\@/\@/gs;
    $str=~s/;SPMquot;!/!/gs;

    $anchor = &make_glossary_entry($br_id,$str,$anchor_invisible_mark,$type);

    join('', $anchor, $_);
}

sub make_glossary_entry { &make_real_glossary_entry(@_) }
sub make_real_glossary_entry {
    local($br_id,$str,$text,$type) = @_;
    local($this_file) = $CURRENT_FILE;
    $TITLE = $saved_title if (($saved_title)&&(!($TITLE)||($TITLE eq $default_title)));
    #extract name, sort, description and format data from $str
    local($name,$sort,$description,$format);

    unless (($str=~/name\s*=\s*${OP}(\d+)${CP}(.+)${OP}\1${CP}\s*,?/s && ($name=$2)) ||
        ($str=~/name\s*=\s*([^,]+)\s*,?/s && ($name=$1)))
    {
       &write_warnings("can't determine name key from $str");
    }

    unless (($str=~/sort\s*=\s*${OP}(\d+)${CP}(.+)${OP}\1${CP}\s*,?/s && ($sort=$2)) ||
        ($str=~/sort\s*=\s*([^,]+)\s*,?/s && ($sort=$1)))
    {
       $sort = $name;
    }

    unless (($str=~/description\s*=\s*${OP}(\d+)${CP}(.+)${OP}\1${CP}\s*,?/s && ($description=$2)) ||
        ($str=~/description\s*=\s*([^,]+)\s*,?/s && ($description=$1)))
    {
       &write_warnings("can't determine description key from $str");
    }

    unless (($str=~/format\s*=\s*${OP}(\d+)${CP}(.+)${OP}\1${CP}\s*,?/s && ($format=$2)) ||
        ($str=~/format\s*=\s*([^,]+)\s*,?/s && ($format=$1)))
    {
       $format = "glsnumformat[$type]";
    }

    # Save the reference
    $str = "$sort$description###" . ++$global{'max_id'}; # Make unique
    # concatenate multiple spaces into a single space
    # otherwise keys won't sort properly
    $str=~s/\s+/ /gs;
    $glossary{$type}{$str} .= &make_half_href($this_file."#$br_id");
    $glossary_name{$type}{$str} = $name;
    $glossary_format{$type}{$str} = $format;
    $glossary_desc{$type}{$str} = $description;
    $glossary_linktext{$type}{$str} = $TITLE;
    "<A HREF=$gls_file_mark{$type}#tex2html$href_name NAME=\"$br_id\">$text<\/A>";
}

sub do_cmd_xglossary{
  local($_) = @_;
  local($entry,$text);
  local($type) = "glossary";

  if (s/^$OP(\d+)${CP}type=(.+)$OP\1$CP//)
  {
     $type = $2;
  }

  $entry = &missing_braces unless
            s/$next_pair_pr_rx/$entry=$2;''/eo;

  $text = &missing_braces unless
            s/$next_pair_pr_rx/$text=$2;''/eo;

  $entry=~s/\"\"/\"/gs;
  $entry=~s/\"\|/\|/gs;
  $entry=~s/\"\@/\@/gs;
  $entry=~s/\"!/!/gs;

  $entry=~s/;SPMquot;;SPMquot;/;SPMquot;/gs;
  $entry=~s/;SPMquot;\|/\|/gs;
  $entry=~s/;SPMquot;\@/\@/gs;
  $entry=~s/;SPMquot;!/!/gs;

  $br_id = ++$global{'max_id'};
  join('', &make_glossary_entry($br_id,$entry,$text,$type),
       $_);
}

sub do_cmd_newglossarytype{
   local($type,$out,$in);
   $type = &missing_braces unless 
           ($_[0]=~s/$next_pair_pr_rx//o&&($type=$2));
   $out = &missing_braces unless 
           ($_[0]=~s/$next_pair_pr_rx//o&&($out=$2));
   $in = &missing_braces unless 
           ($_[0]=~s/$next_pair_pr_rx//o&&($in=$2));

   &make_newglossarytype($type);

   $_[0];
}

sub make_newglossarytype{
   local($type) = @_;

   eval ("sub do_cmd_make$type\{\}");

   $gls_mark{$type} = "<tex2html_${type}_mark>";
   $gls_file_mark{$type} = "<tex2html_${type}_file_mark>";
   $gls_title{$type} = "\\glossaryname";

   local($tmp) = 'sub do_cmd_' . $type. '{';
   $tmp .= 'local($id) = ++$global{\'max_id\'};';
   $tmp .= '"\\\\glossary$OP$id${CP}type=' . $type . '$OP$id$CP".$_[0];';
   $tmp .= '}';

   eval($tmp);

   $tmp = 'sub do_cmd_x' . $type. '{';
   $tmp .= 'local($id) = ++$global{\'max_id\'};';
   $tmp .= '"\\\\xglossary$OP$id${CP}type=' . $type . '$OP$id$CP".$_[0];';
   $tmp .= '}';

   eval($tmp);

   $tmp = 'sub do_cmd_print' . $type. '{';
   #$tmp .= 'local($id)=++$global{\'max_id\'};';
   $tmp .= '"\\\\textohtmlglossary[' . $type
        . ']" . $_[0]';
   $tmp .= '}';

   eval($tmp);

   $delimN{$type} = ", ";
   $glodelim{$type} = "";
   $glsnumformat{$type} = "";

}

sub do_cmd_gloshort{
  local($_) = @_;
  join('', "<tex2html_GLOSHORT_mark>", $_);
}

sub do_cmd_glolong{
  local($_) = @_;
  join('', "<tex2html_GLOLONG_mark>", $_);
}

$acronymnamefmt = "<tex2html_GLOLONG_mark> (<tex2html_GLOSHORT_mark>)";

sub do_cmd_setacronymnamefmt{
   local($_) = @_;

   $acronymnamefmt = &missing_braces unless
             s/$next_pair_pr_rx/$acronymnamefmt=$2;''/eo;

   $_;
}

sub do_cmd_acronymfont{
   local($_) = @_;
   local($text) = &missing_braces unless
                  s/$next_pair_pr_rx/$text=$2;''/eo;

   $text . $_;
}

 %acronym = ();

sub do_cmd_newacronym{
   local($_) = @_;
   local($cmdname,$pat,$abbrv,$long,$glsentry,$name);

   ($cmdname,$pat) = &get_next_optional_argument;

   $abbrv = &missing_braces unless
        (s/$next_pair_pr_rx/$abbrv=$2;''/eo);
   $long = &missing_braces unless
        (s/$next_pair_pr_rx/$long=$2;''/eo);
   $glsentry = &missing_braces unless
        (s/$next_pair_pr_rx/$glsentry=$2;''/eo);

   if ($cmdname eq '')
   {
      $cmdname = $abbrv;
   }

   local($id);
   $id = ++$global{'max_id'};
   local($fmtedabbrv) = &translate_commands("\\acronymfont$OP$id$CP$abbrv$OP$id$CP");

   unless ($glsentry=~/name=/)
   {
      $name = $acronymnamefmt;
      $name=~s/<tex2html_GLOSHORT_mark>/$fmtedabbrv/egs;
      $name=~s/<tex2html_GLOLONG_mark>/$long/egs;
      $id = ++$global{'max_id'};
      $glsentry .= ",name=$OP$id$CP$name$OP$id$CP";
   }

   $global{"${cmdname}first"} = 1;
   $acronym{$cmdname}{'abbrv'} = $abbrv;
   $acronym{$cmdname}{'long'} = $long;
   $acronym{$cmdname}{'entry'} = $glsentry;

   local($tmp);

   unless ($cmdname=~/[^a-zA-Z]/)
   {
      $tmp = 'sub do_cmd_' . $cmdname . '{';
      $tmp .= 'local($_)=@_;';
      $tmp .= 'local($id)=++$global{\'max_id\'};';
      $tmp .= 'local($str);';
      $tmp .= '$str="${OP}$id${CP}'
            . $cmdname
            . '${OP}$id${CP}";';
      $tmp .= '&do_cmd_useacronym($str . $_[0])';
      $tmp .= '}';

      eval($tmp);

      $tmp = 'sub do_cmd_' . $cmdname . 'star{';
      $tmp .= 'local($_)=@_;';
      $tmp .= 'local($id)=++$global{\'max_id\'};';
      $tmp .= 'local($str);';
      $tmp .= '$str="${OP}$id${CP}'
            . $cmdname
            . '${OP}$id${CP}";';
      $tmp .= '&do_cmd_useacronymstar($str . $_[0])';
      $tmp .= '}';

      eval($tmp);

      $tmp = 'sub do_cmd_' . $cmdname . 'long{';
      $tmp .= 'local($_)=@_;';
      $tmp .= 'join("", \'' . $long . '\', $_[0])';
      $tmp .= '}';

      eval($tmp);

      $tmp = 'sub do_cmd_' . $cmdname . 'short{';
      $tmp .= 'local($_)=@_;';
      $tmp .= 'join("", \'' . $fmtedabbrv . '\', $_[0])';
      $tmp .= '}';

      eval($tmp);
   }

   $_;
}

sub do_cmd_acrsh{
   local($_) = @_;
   local($cmdname,$text,$id);

   $cmdname = &missing_braces unless
                (s/$next_pair_pr_rx/$id=$1;$cmdname=$2;''/eo);

   $text = &translate_commands("\\${cmdname}short");

   $text . $_;
}

sub do_cmd_acrshstar{
   local($_) = @_;
   local($cmdname,$text,$id);

   $cmdname = &missing_braces unless
                (s/$next_pair_pr_rx/$id=$1;$cmdname=$2;''/eo);

   $text = &translate_commands("\\${cmdname}short");

   $text=~s/(<.*>)?(\w)/\1\u\2/;

   $text . $_;
}

sub do_cmd_acrln{
   local($_) = @_;
   local($cmdname,$text,$id);

   $cmdname = &missing_braces unless
                (s/$next_pair_pr_rx/$id=$1;$cmdname=$2;''/eo);

   $text = &translate_commands("\\${cmdname}long");

   $text . $_;
}

sub do_cmd_acrlnstar{
   local($_) = @_;
   local($cmdname,$text,$id);

   $cmdname = &missing_braces unless
                (s/$next_pair_pr_rx/$id=$1;$cmdname=$2;''/eo);

   $text = &translate_commands("\\${cmdname}long");

   $text=~s/(\w)/\u\1/;

   $text . $_;
}

sub do_cmd_useacronym{
   local($_)=@_;
   local($str,$abbrv,$long,$entry,$id);

   local($optarg,$pat)=&get_next_optional_argument;

   $cmdname = &missing_braces unless
                (s/$next_pair_pr_rx/$cmdname=$2;''/eo);

   if (defined %{$acronym{$cmdname}})
   {
      $abbrv = $acronym{$cmdname}{'abbrv'};
      $long = $acronym{$cmdname}{'long'};
      $entry = $acronym{$cmdname}{'entry'};
      $id = ++$global{'max_id'};
      $abbrv = "\\acronymfont$OP$id$CP$abbrv$OP$id$CP";

      $id = ++$global{'max_id'};
      $str = "\\xglossary${OP}$id${CP}type="
        . $acronymtype. "${OP}$id${CP}";
      $id = ++$global{'max_id'};
      $str .= "${OP}$id${CP}"
        . $entry . "${OP}$id${CP}";
      $id = ++$global{'max_id'};
      $str .= "${OP}$id${CP}";
      $str .= ($global{"${cmdname}first"} ? "$long$optarg ($abbrv)" : "$abbrv$optarg");
      $str .= "${OP}$id${CP}";

      $global{"${cmdname}first"} = 0;
   }
   else
   {
      &write_warnings("acronym '$cmdname' not defined");
   }

   $str . $_
}

sub do_cmd_useacronymstar{
   local($_)=@_;
   local($str,$abbrv,$long,$entry,$id);
   local($optarg,$pat)=&get_next_optional_argument;

   $cmdname = &missing_braces unless
               (s/$next_pair_pr_rx/$cmdname=$2;''/eo);

   if (defined %{$acronym{$cmdname}})
   {
      $abbrv = $acronym{$cmdname}{'abbrv'};
      $long = $acronym{$cmdname}{'long'};
      $entry = $acronym{$cmdname}{'entry'};

      if ($global{"${cmdname}first"})
      {
         $long=~s/^([^a-zA-Z]*)([a-zA-Z])/\1\u\2/;
      }
      else
      {
         $abbrv=~s/^([^a-zA-Z]*)([a-zA-Z])/\1\u\2/;
      }

      $id = ++$global{'max_id'};
      $abbrv = "\\acronymfont$OP$id$CP$abbrv$OP$id$CP";

      $name = ($global{"${cmdname}first"} ? "$long$optarg ($abbrv)" : "$abbrv$optarg");

      $id = ++$global{'max_id'};
      $str = "\\xglossary${OP}$id${CP}type="
        . $acronymtype . "${OP}$id${CP}";
      $id = ++$global{'max_id'};
      $str .= "${OP}$id${CP}"
        . $entry . "${OP}$id${CP}";
      $id = ++$global{'max_id'};
      $str .= "${OP}$id${CP}";
      $str .= $name;
      $str .= "${OP}$id${CP}";

      $global{"${cmdname}first"} = 0;
   }
   else
   {
      &write_warnings("acronym '$cmdname' not defined");
   }

   $str . $_
}

sub do_cmd_ifacronymfirstuse{
   local($_) = @_;
   local($acronym,$truebit,$falsebit,$str);

   $acronym = &missing_braces unless ($_[0]=~s/$next_pair_pr_rx//o&&($acronym=$2));
   $truebit = &missing_braces unless ($_[0]=~s/$next_pair_pr_rx//o&&($truebit=$2));
   $falsebit = &missing_braces unless ($_[0]=~s/$next_pair_pr_rx//o&&($falsebit=$2));

   $str = ($global{"${acronym}true"} ? $truebit : $falsebit);

   $str . $_[0];
}

sub do_cmd_resetacronym{
   local($_) = @_;
   local($cmdname);

   $cmdname = &missing_braces unless
               (s/$next_pair_pr_rx/$cmdname=$2;''/eo);

   if (defined %{$acronym{$cmdname}})
   {
      $global{"${cmdname}first"} = 1;
   }
   else
   {
      &write_warnings("acronym '$cmdname' not defined");
   }

   $_;
}

sub do_cmd_resetallacronyms{
   local($_) = @_;

   foreach $key (keys %acronym)
   {
      $global{"${key}first"} = 1;
   }

   $_;
}

sub do_cmd_unsetacronym{
   local($_) = @_;
   local($cmdname);

   $cmdname = &missing_braces unless
               (s/$next_pair_pr_rx/$cmdname=$2;''/eo);

   if (defined %{$acronym{$cmdname}})
   {
      $global{"${cmdname}first"} = 0;
   }
   else
   {
      &write_warnings("acronym '$cmdname' not defined");
   }

   $_;
}

sub do_cmd_unsetallacronyms{
   local($_) = @_;

   foreach $key (keys %acronym)
   {
      $global{"${key}first"} = 0;
   }

   $_;
}

 %savedglosentry = ();

# This command is deprecated
sub do_cmd_saveglosentry{
   local($_) = @_;
   local($name,$desc,$type,$pat);

   ($type,$pat) = &get_next_optional_argument;

   $name = &missing_braces unless 
             s/$next_pair_pr_rx/$name=$2;''/eo;
   $desc = &missing_braces unless 
             s/$next_pair_pr_rx/$desc=$2;''/eo;

   $savedglosentry{$name}{'entry'} = "name=$name,description=$desc";
   $savedglosentry{$name}{'type'} = $type;

   $_;
}

sub do_cmd_storeglosentry{
   local($_) = @_;
   local($type,$pat,$entry,$label);

   ($type,$pat) = &get_next_optional_argument;

   if ($type eq '')
   {
      $type = 'glossary';
   }

   $label = &missing_braces unless
              s/$next_pair_pr_rx/$label=$2;''/eo;

   $entry = &missing_braces unless
              s/$next_pair_pr_rx/$entry=$2;''/eo;

   $savedglosentry{$label}{'entry'} = $entry;
   $savedglosentry{$label}{'type'} = $type;

   $_;
}

sub do_cmd_useglosentry{
   local($_) = @_;
   local($optarg,$pat,$name,$str,$id);
   ($optarg,$pat) = &get_next_optional_argument;

   $name = &missing_braces unless
             (s/$next_pair_pr_rx/$name=$2;''/eo);

   if (defined $savedglosentry{$name}{type})
   {
      $id = ++$global{'max_id'};
      $str = "\\$savedglosentry{$name}{type}${OP}$id${CP}$savedglosentry{$name}{entry}";

      unless ($optarg eq "")
      {
         $str .= ",$optarg";
      }

      $str .= "${OP}$id${CP}";
   }
   else
   {
      &write_warnings("glossary entry '$name' undefined");
      $str = '';
   }

   $str . $_;
}

sub do_cmd_useGlosentry{
   local($_) = @_;
   local($optarg,$pat,$name,$str,$id);
   ($optarg,$pat) = &get_next_optional_argument;

   $name = &missing_braces unless
             (s/$next_pair_pr_rx/$name=$2;''/eo);

   if (defined $savedglosentry{$name}{type})
   {
      $id = ++$global{'max_id'};
      $str = "\\x$savedglosentry{$name}{type}${OP}$id${CP}$savedglosentry{$name}{entry}";

      unless ($optarg eq "")
      {
         $str .= ",$optarg";
      }

      $str .= "${OP}$id${CP}";
   }
   else
   {
      &write_warnings("glossary entry '$name' undefined");
      $str = '';
   }

   $str . $_;
}

sub do_cmd_gls{
   local($_) = @_;
   local($optarg,$pat,$label,$str,$id,$name);
   ($optarg,$pat) = &get_next_optional_argument;

   $label = &missing_braces unless
             (s/$next_pair_pr_rx/$label=$2;''/eo);

   if (defined $savedglosentry{$label}{type})
   {
      $str = $savedglosentry{$label}{'entry'};

      if ($str=~/name=[ ]*${OP}(\d+)${CP}(.*)${OP}\1${CP}/s)
      {
         $name = $2;
      }
      elsif (($str=~/name=[ ]*([^,]+),/m) 
          || ($str=~/name=[ ]*([^,]+)\Z(?!\n)/m))
      {
         $name = $1;
      }

      $id = ++$global{'max_id'};
      $str = "\\x$savedglosentry{$label}{type}${OP}$id${CP}$savedglosentry{$label}{entry}";

      unless ($optarg eq "")
      {
         $str .= ",$optarg";
      }

      $str .= "${OP}$id${CP}";
      $id = ++$global{'max_id'};
      $str .= "${OP}$id${CP}$name${OP}$id${CP}";
   }
   else
   {
      &write_warnings("glossary entry '$label' undefined");
      $str = '';
   }

   $str . $_;
}

sub do_cmd_glossarypreamble{
   local($_) = @_;
   $_[0];
}

sub do_cmd_glossarypostamble{
   local($_) = @_;
   $_[0];
}

sub do_cmd_glsnumformat{
   local($_) = @_;
   local($type,$pat) = &get_next_optional_argument;

   if ($type eq '')
   {
      $type = 'glossary';
   }

   local($cmd) = '';
   unless ($glsnumformat{$type} eq '')
   {
      $cmd = "\\$glsnumformat{$type}";
   }

   $cmd . $_;
}

sub do_cmd_setglossary{
   local($_) = @_;
   local($str,$type,$format,$delimN,$glodelim);
   $str = &missing_braces unless ($_[0]=~s/$next_pair_pr_rx//o&&($str=$2));

   unless (($str=~/type=([^,]+),|$/&&($type=$1)) ||
    ($str=~/type=${OP}(\d+)${CP}(.*)${OP}\1${CP}/&&($type=$2)))
   {
      $type = 'glossary';
   }

   if ($str=~/glsnumformat=[ ]*${OP}(\d+)${CP}(.*)${OP}\1${CP}/s)
   {
      $format = $2;
   }
   elsif (($str=~/glsnumformat=[ ]*([^,]+),/m) 
       || ($str=~/glsnumformat=[ ]*([^,]+)\Z(?!\n)/m))
   {
      $format = $1;
   }

   if ($format ne '')
   {
      $glsnumformat{$type} = $format;

      if ($format eq 'ignore')
      {
         $delimN{$type} = '';
      }
   }

   if (($str=~/delimN=([^,]+),|$/&&($delimN=$1)) ||
    ($str=~/delimN=${OP}(\d+)${CP}(.*)${OP}\1${CP}/&&($delimN=$2)))
   {
      $delimN{$type} = $delimN;
   }

   if (($str=~/glodelim=([^,]+),|$/&&($glodelim=$1)) ||
    ($str=~/glodelim=${OP}(\d+)${CP}(.*)${OP}\1${CP}/&&($glodelim=$2)))
   {
      $glodelim{$type} = $glodelim;
   }

   $_[0];
}

sub do_cmd_ignore{
   local($_) = @_;
   local($str);
   $str = &missing_braces unless ($_[0]=~s/$next_pair_pr_rx//o&&($str=$2));

   $_[0];
}

sub do_cmd_hyperit{
   join('', "\\textit ", $_[0]);
}

sub do_cmd_hyperrm{
   join('', "\\textrm ", $_[0]);
}

sub do_cmd_hypertt{
   join('', "\\texttt ", $_[0]);
}

sub do_cmd_hypersf{
   join('', "\\textsf ", $_[0]);
}

sub do_cmd_hyperbf{
   join('', "\\textbf ", $_[0]);
}

&ignore_commands( <<_IGNORED_CMDS_ );
makeglossary
makeacronym
_IGNORED_CMDS_

1;
%    \end{macrocode}
%    \begin{macrocode}
%</glossary.perl>
%    \end{macrocode}
%    \begin{macrocode}
%<*sample.tex>
%    \end{macrocode}
%    \begin{macrocode}
\documentclass[a4paper]{report}

\usepackage[plainpages=false,colorlinks]{hyperref}
\usepackage{glossary}

\makeglossary

% You need to use the -m switch with makeglos.pl to concatenate
% entries with the same name but different descriptions
% If you don't, and you use PDFLaTeX you will get a warning
% about duplicate labels. To prevent this, set a different
% sort key for each entry, e.g. sort=glossary1 for the first
% entry and sort=glossary2 for the second entry

\storeglosentry{glossary1}{name=glossary,
description=1) list of technical words}

\storeglosentry{glossary2}{name=glossary,
description=2) collection of glosses}

\storeglosentry{Perl}{name=\texttt{Perl},
sort=Perl, % need a sort key because name contains a command
description=A scripting language}

\storeglosentry{pagelist}{name=page list,
% description value has to be enclosed in braces
% because it contains commas
description={a list of individual pages or page ranges, 
e.g.\ 1,2,4,7-9}}

\begin{document}

\title{Sample Document Using glossary Package}
\author{Nicola Talbot}
\pagenumbering{alph}% prevent duplicate page link names if using PDF
\maketitle

\pagenumbering{roman}
\tableofcontents

\chapter{Introduction}
\pagenumbering{arabic}

A \gls{glossary1} is a very useful addition to any
technical document, although a \gls{glossary2} can 
also simply be a collection of glosses, which is
another thing entirely.

Once you have run your document through \LaTeX, you
will then need to run the \texttt{.glo} file through
\texttt{makeindex}.  You will need to set the output
file so that it creates a \texttt{.gls} file instead
of an \texttt{.ind} file, and change the name of 
the log file so that it doesn't overwrite the index
log file (if you have an index for your document).  
Rather than having to remember all the command line
switches, you can call the \gls{Perl} script
\texttt{makeglos.pl} which provides a convenient
wrapper.

If you have two terms with different meanings in your
\gls{glossary1}, \texttt{makeindex} will of course treat them as two 
separate entries, however, some people prefer to 
merge them.  This can be done using \texttt{makeglos.pl}, and 
passing the option \texttt{-m}.

If a comma appears within the name or description, grouping
must be used: \gls{pagelist}.

\printglossary

\end{document}
%    \end{macrocode}
%    \begin{macrocode}
%</sample.tex>
%    \end{macrocode}
%    \begin{macrocode}
%<*sample4col.tex>
%    \end{macrocode}
%    \begin{macrocode}
\documentclass[a4paper]{article}

% start out with 3 column format to make it easier to modify
\usepackage[style=long,cols=3]{glossary}[2006/07/20]

% make glossary have 4 columns all left aligned
% (this assumes entries can fit onto a single line
% otherwise use p{} specifier instead of l)
\renewcommand{\glossaryalignment}{llll}

% Define header row
\newcommand{\glossaryheader}{%
\bfseries Name & \bfseries Description & \bfseries Unit &
\bfseries Page}

\makeglossary

\storeglosentry{w}{name={$w$},sort=w,description={width&m}}
\storeglosentry{M}{name={$M$},sort=M,description={mass&kg}}

\begin{document}

\printglossary

The width, \gls{w}, is measured in meters. The mass, \gls{M} is
measured in kilograms.

\end{document}
%    \end{macrocode}
%    \begin{macrocode}
%</sample4col.tex>
%    \end{macrocode}
%    \begin{macrocode}
%<*sampleAcr.tex>
%    \end{macrocode}
%    \begin{macrocode}
\documentclass[a4paper]{report}

\usepackage[colorlinks,plainpages=false]{hyperref}
\usepackage[style=altlist,hypertoc,acronym]{glossary}

% use \makeglossary if using package option
% acronym=false
%\makeglossary
% use \makeacronym if using package option
% acronym=true
\makeacronym

\newacronym{svm}{support vector machine}{%
description=Statistical pattern recognition 
technique~\cite{svm}}

\newacronym[ksvm]{k-svm}{kernel support vector machine}{%
description={Statistical pattern recognition technique 
using the ``kernel trick'' (see also SVM)}}

\begin{document}
\tableofcontents

\chapter{Support Vector Machines}

The \svm\ is used widely in the area of pattern recognition.
\useacronym*[s]{svm} are \ldots

This is the long version: \svmlong\ or alternatively:
\acrln*{svm}.
Abbreviation: \svmshort\ or \acrsh*{svm}.

\chapter{Kernel Support Vector Machines}

The \ksvm\ is \ifacronymfirstuse{svm}{a}{an} \svm\ that uses 
the so called ``kernel trick''.

%\resetacronym{ksvm}
\resetallacronyms
\useacronym*[s]{ksvm} \ldots
\svm.

\begin{thebibliography}{1}
\bibitem{svm} \ldots
\end{thebibliography}

%\printglossary
\printacronym

\end{document}
%    \end{macrocode}
%    \begin{macrocode}
%</sampleAcr.tex>
%    \end{macrocode}
%    \begin{macrocode}
%<*sampleEq.tex>
%    \end{macrocode}
%    \begin{macrocode}
\documentclass[a4paper,12pt]{report}

\usepackage{amsmath}
\usepackage[colorlinks]{hyperref}
\usepackage[header,border=none,cols=3,number=equation]{glossary}[2006/07/20]

\newcommand{\erf}{\operatorname{erf}}
\newcommand{\erfc}{\operatorname{erfc}}

\makeglossary

% Uncomment the following line to put a blank line between 
% every entry:
%\setglossary{delimT={\cr & \cr},gloskip={}}

% Change the glossary title:

\renewcommand{\glossaryname}{Index of Special Functions 
and Notations}

% Change the glossary headings

\renewcommand{\entryname}{Notation}

\renewcommand{\descriptionname}{Function Name}

\renewcommand{\glspageheader}{Number of Formula}

% Add a blank row after the header row
\newcommand{\glossarysubheader}{ & & \\}

% Store entries for later use

\storeglosentry{Gamma}{name=\ensuremath{\Gamma(z)},
description=Gamma function,sort=Gamma}

\storeglosentry{gamma}{name={\ensuremath{\gamma(\alpha,x)}},
description=Incomplete gamma function,sort=gamma}

\storeglosentry{iGamma}{name={\ensuremath{\Gamma(\alpha,x)}},
description=Incomplete gamma function,sort=Gamma}

\storeglosentry{psi}{name=\ensuremath{\psi(x)},
description=Psi function,sort=psi}

\storeglosentry{erf}{name=\ensuremath{\erf(x)},
description=Error function,sort=erf}

\storeglosentry{erfc}{name=\ensuremath{\erfc},
description=Complementary error function,sort=erfc}

\storeglosentry{B}{name={\ensuremath{B(x,y)}},
description=Beta function,sort=B}

\storeglosentry{Bx}{name={\ensuremath{B_x(p,q)}},
description=Incomplete beta function,sort=Bx}

\storeglosentry{Tn}{name=\ensuremath{T_n(x)},
description=Chebyshev's polynomials of the first kind,sort=Tn}

\storeglosentry{Un}{name=\ensuremath{U_n(x)},
description=Chebyshev's polynomials of the second kind,sort=Un}

\storeglosentry{Hn}{name=\ensuremath{H_n(x)},
description=Hermite polynomials,sort=Hn}

\storeglosentry{Ln}{name=\ensuremath{L_n^\alpha(x)},
description=Laguerre polynomials,sort=Lna}

\storeglosentry{Znu}{name=\ensuremath{Z_\nu(z)},
description=Bessel functions,sort=Z}

\storeglosentry{Phi}{name={\ensuremath{\Phi(\alpha,\gamma;z)}},
description=confluent hypergeometric function,sort=Pagz}

\storeglosentry{knu}{name=\ensuremath{k_\nu(x)},
description=Bateman's function,sort=kv}

\storeglosentry{Dp}{name=\ensuremath{D_p(z)},
description=Parabolic cylinder functions,sort=Dp}

\storeglosentry{F}{name={\ensuremath{F(\phi,k)}},
description=Elliptical integral of the first kind,sort=Fpk}

\storeglosentry{C}{name=\ensuremath{C},
description=Euler's constant,sort=C}

\storeglosentry{G}{name=\ensuremath{G},
description=Catalan's constant,sort=G}

\begin{document}
\title{A Sample Document Using glossary.sty}
\author{Nicola Talbot}
\maketitle

\begin{abstract}
This is a sample document illustrating the use of the \textsf{glossary}
package.  The functions here have been taken from ``Tables of
Integrals, Series, and Products'' by I.S.~Gradshteyn and I.M~Ryzhik.
The glossary is a list of special functions, so 
the equation number has been used rather than the page number.  This 
can be done using the \texttt{number=equation} package
option.
\end{abstract}

\printglossary

\chapter{Gamma Functions}

\begin{equation}
\gls{Gamma} = \int_{0}^{\infty}e^{-t}t^{z-1}\,dt
\end{equation}

\verb|\ensuremath| is only required here if using 
hyperlinks.
\begin{equation}
\useGlosentry{Gamma}{\ensuremath{\Gamma(x+1)}} = x\Gamma(x)
%\useGlosentry{Gamma}{\Gamma(x+1)} = x\Gamma(x)
\end{equation}

\begin{equation}
\gls{gamma} = \int_0^x e^{-t}t^{\alpha-1}\,dt
\end{equation}

\begin{equation}
\gls{iGamma} = \int_x^\infty e^{-t}t^{\alpha-1}\,dt
\end{equation}

\newpage

\begin{equation}
\gls{Gamma} = \Gamma(\alpha, x) + \gamma(\alpha, x)
\end{equation}

\begin{equation}
\gls{psi} = \frac{d}{dx}\ln\Gamma(x)
\end{equation}

\chapter{Error Functions}

\begin{equation}
\gls{erf} = \frac{2}{\surd\pi}\int_0^x e^{-t^2}\,dt
\end{equation}

\begin{equation}
\gls{erfc} = 1 - \erf(x)
\end{equation}

\chapter{Beta Function}

\begin{equation}
\gls{B} = 2\int_0^1 t^{x-1}(1-t^2)^{y-1}\,dt
\end{equation}
Alternatively:
\begin{equation}
\gls{B} = 2\int_0^{\frac\pi2}\sin^{2x-1}\phi\cos^{2y-1}\phi\,d\phi
\end{equation}

\begin{equation}
\gls{B} = \frac{\Gamma(x)\Gamma(y)}{\Gamma(x+y)} = B(y,x)
\end{equation}

\begin{equation}
\gls{Bx} = \int_0^x t^{p-1}(1-t)^{q-1}\,dt
\end{equation}

\chapter{Polynomials}

\section{Chebyshev's polynomials}

\begin{equation}
\gls{Tn} = \cos(n\arccos x)
\end{equation}

\begin{equation}
\gls{Un} = \frac{\sin[(n+1)\arccos x]}{\sin[\arccos x]}
\end{equation}

\section{Hermite polynomials}

\begin{equation}
\gls{Hn} = (-1)^n e^{x^2} \frac{d^n}{dx^n}(e^{-x^2})
\end{equation}

\section{Laguerre polynomials}

\begin{equation}
L_n^{\alpha} (x) = \frac{1}{n!}e^x x^{-\alpha} 
\frac{d^n}{dx^n}(e^{-x}x^{n+\alpha})
\end{equation}

\chapter{Bessel Functions}

Bessel functions $Z_\nu$ are solutions of
\begin{equation}
\useglosentry{Znu}
\frac{d^2Z_\nu}{dz^2} + \frac{1}{z}\,\frac{dZ_\nu}{dz} + 
\left( 1-\frac{\nu^2}{z^2}Z_\nu = 0 \right)
\end{equation}

\chapter{Confluent hypergeometric function}

\begin{equation}
\gls{Phi} = 1 + \frac{\alpha}{\gamma}\,\frac{z}{1!}
+ \frac{\alpha(\alpha+1)}{\gamma(\gamma+1)}\,\frac{z^2}{2!}
+\frac{\alpha(\alpha+1)(\alpha+2)}{\gamma(\gamma+1)(\gamma+2)}\,
\frac{z^3}{3!} + \cdots
\end{equation}

\begin{equation}
\gls{knu} = \frac{2}{\pi}\int_0^{\pi/2}
\cos(x \tan\theta - \nu\theta)\,d\theta
\end{equation}

\chapter{Parabolic cylinder functions}

\begin{equation}
\gls{Dp} = 2^{\frac{p}{2}}e^{-\frac{z^2}{4}}
\left\{
\frac{\surd\pi}{\Gamma\left(\frac{1-p}{2}\right)}
\Phi\left(-\frac{p}{2},\frac{1}{2};\frac{z^2}{2}\right)
-\frac{\sqrt{2\pi}z}{\Gamma\left(-\frac{p}{2}\right)}
\Phi\left(\frac{1-p}{2},\frac{3}{2};\frac{z^2}{2}\right)
\right\}
\end{equation}

\chapter{Elliptical Integral of the First Kind}

\begin{equation}
\gls{F} = \int_0^\phi \frac{d\alpha}{\sqrt{1-k^2\sin^2\alpha}}
\end{equation}

\chapter{Constants}

\begin{equation}
\gls{C} = 0.577\,215\,664\,901\ldots
\end{equation}

\begin{equation}
\gls{G} = 0.915\,965\,594\ldots
\end{equation}

\end{document}
%    \end{macrocode}
%    \begin{macrocode}
%</sampleEq.tex>
%    \end{macrocode}
%    \begin{macrocode}
%<*sampleEqPg.tex>
%    \end{macrocode}
%    \begin{macrocode}
\documentclass[a4paper,12pt]{report}

\usepackage{amsmath}
\usepackage[colorlinks]{hyperref}
\usepackage[header,toc,border=none,cols=3,
            number=equation]{glossary}[2006/07/20]

\newcommand{\erf}{\operatorname{erf}}
\newcommand{\erfc}{\operatorname{erfc}}

\renewcommand{\glossaryname}{Index of Special Functions and Notations}

\renewcommand{\glossarypreamble}{Numbers in italic indicate the equation number,
numbers in bold indicate page numbers where the main definition occurs.\par}

% set the default glossary numbers to italic
% hyperit is used instead of textit because
% the hyperref package is being used.
\setglossary{glsnumformat=hyperit}

% 1st column heading
\renewcommand{\entryname}{Notation}

% 2nd column heading
\renewcommand{\descriptionname}{Function Name}

% Add a blank row after the header
\newcommand{\glossarysubheader}{ & & \\}

% store glossary entries for later use

\storeglosentry{Gamma}{name=\ensuremath{\Gamma(z)},
description=Gamma function,sort=Gamma}

\storeglosentry{gamma}{name=\ensuremath{\gamma(\alpha,x)},
description=Incomplete gamma function,sort=gamma}

\storeglosentry{iGamma}{name=\ensuremath{\Gamma(\alpha,x)},
description=Incomplete gamma function,sort=Gamma}

\storeglosentry{psi}{name=\ensuremath{\psi(x)},
description=Psi function,sort=psi}

\storeglosentry{erf}{name=\ensuremath{\erf(x)},
description=Error function,sort=erf}

\storeglosentry{erfc}{name=\ensuremath{\erfc(x)},
description=Complementary error function,sort=erfc}

\storeglosentry{beta}{name=\ensuremath{B(x,y)},
description=Beta function,sort=B}

\storeglosentry{Bx}{name=\ensuremath{B_x(p,q)},
description=Incomplete beta function,sort=Bx}

\storeglosentry{Tn}{name=\ensuremath{T_n(x)},
description=Chebyshev's polynomials of the first kind,
sort=Tn}

\storeglosentry{Un}{name=\ensuremath{U_n(x)},
description=Chebyshev's polynomials of the second kind,
sort=Un}

\storeglosentry{Hn}{name=\ensuremath{H_n(x)},
description=Hermite polynomials,sort=Hn}

\storeglosentry{Lna}{name=\ensuremath{L_n^\alpha(x)},
description=Laguerre polynomials,sort=Lna}

\storeglosentry{Znu}{name=\ensuremath{Z_\nu(z)},
description=Bessel functions,sort=Z}

\storeglosentry{Pagz}{name=\ensuremath{\Phi(\alpha,\gamma;z)},
description=confluent hypergeometric function,sort=Pagz}

\storeglosentry{kv}{name=\ensuremath{k_\nu(x)},
description=Bateman's function,sort=kv}

\storeglosentry{Dp}{name=\ensuremath{D_p(z)},
description=Parabolic cylinder functions,sort=Dp}

\storeglosentry{Fpk}{name=\ensuremath{F(\phi,k)},
description=Elliptical integral of the first kind,sort=Fpk}

\storeglosentry{C}{name=\ensuremath{C},
description=Euler's constant,sort=C}

\storeglosentry{G}{name=\ensuremath{G},
description=Catalan's constant,sort=G}

\renewcommand{\shortglossaryname}{Special Functions}

\makeglossary

\pagestyle{headings}

\begin{document}

\title{Sample Document Using Interchangable Numbering}
\author{Nicola Talbot}
\maketitle

\begin{abstract}
This is a sample document illustrating the use of the \textsf{glossary}
package.  The functions here have been taken from ``Tables of
Integrals, Series, and Products'' by I.S.~Gradshteyn and I.M~Ryzhik.

The glossary lists both page numbers and equation numbers.  
Since the majority of the entries use the equation number,
\texttt{number=equation} was used as a package option.
The entries that should refer to the page number instead
use the \texttt{number=equation} glossary key.
Note that this example will only work where the
page number and equation number compositor is the same. So 
it won't work if, say, the page numbers are of the form 
2-4 and the equation numbers are of the form 4.6.  
As most of the glossary entries should have an italic 
format, it is easiest to set the default format to 
italic.

\end{abstract}

\tableofcontents

\printglossary

\chapter{Gamma Functions}

The \useGlosentry[number=page,format=hyperbf]{Gamma}{gamma function} is 
defined as
\begin{equation}
\gls{Gamma} = \int_{0}^{\infty}e^{-t}t^{z-1}\,dt
\end{equation}

\begin{equation}
\useGlosentry{Gamma}{\ensuremath{\Gamma(x+1)}} = x\Gamma(x)
\end{equation}

\begin{equation}
\gls{gamma} = \int_0^x e^{-t}t^{\alpha-1}\,dt
\end{equation}

\begin{equation}
\gls{iGamma} = \int_x^\infty e^{-t}t^{\alpha-1}\,dt
\end{equation}

\newpage

\begin{equation}
\useGlosentry{Gamma}{\ensuremath{\Gamma(\alpha)}} = \Gamma(\alpha, x) + \gamma(\alpha, x)
\end{equation}

\begin{equation}
\gls{psi} = \frac{d}{dx}\ln\Gamma(x)
\end{equation}

\chapter{Error Functions}

The \useGlosentry[number=page,format=hyperbf]{erf}{error 
function} is defined as:
\begin{equation}
\gls{erf} = \frac{2}{\surd\pi}\int_0^x e^{-t^2}\,dt
\end{equation}

\begin{equation}
\gls{erfc} = 1 - \erf(x)
\end{equation}

\chapter{Beta Function}

\begin{equation}
\gls{beta} = 2\int_0^1 t^{x-1}(1-t^2)^{y-1}\,dt
\end{equation}
Alternatively:
\begin{equation}
\gls{beta} = 2\int_0^{\frac\pi2}\sin^{2x-1}\phi\cos^{2y-1}\phi\,d\phi
\end{equation}

\begin{equation}
\gls{beta} = \frac{\Gamma(x)\Gamma(y)}{\Gamma(x+y)} = B(y,x)
\end{equation}

\begin{equation}
\gls{Bx} = \int_0^x t^{p-1}(1-t)^{q-1}\,dt
\end{equation}

\chapter{Chebyshev's polynomials}

\begin{equation}
\gls{Tn} = \cos(n\arccos x)
\end{equation}

\begin{equation}
\gls{Un} = \frac{\sin[(n+1)\arccos x]}{\sin[\arccos x]}
\end{equation}

\chapter{Hermite polynomials}

\begin{equation}
\gls{Hn} = (-1)^n e^{x^2} \frac{d^n}{dx^n}(e^{-x^2})
\end{equation}

\chapter{Laguerre polynomials}

\begin{equation}
\gls{Lna} = \frac{1}{n!}e^x x^{-\alpha} 
\frac{d^n}{dx^n}(e^{-x}x^{n+\alpha})
\end{equation}

\chapter{Bessel Functions}

Bessel functions $Z_\nu(z)$ are solutions of
\begin{equation}
\frac{d^2Z_\nu}{dz^2} + \frac{1}{z}\,\frac{dZ_\nu}{dz} + 
\left(
1-\frac{\nu^2}{z^2}Z_\nu = 0
\right)
\end{equation}
\useglosentry{Znu}

\chapter{Confluent hypergeometric function}

\begin{equation}
\gls{Pagz} = 1 + \frac{\alpha}{\gamma}\,\frac{z}{1!}
+ \frac{\alpha(\alpha+1)}{\gamma(\gamma+1)}\,\frac{z^2}{2!}
+\frac{\alpha(\alpha+1)(\alpha+2)}
      {\gamma(\gamma+1)(\gamma+2)}
\,\frac{z^3}{3!}
+ \cdots
\end{equation}

\begin{equation}
\gls{kv} = \frac{2}{\pi}\int_0^{\pi/2}
\cos(x \tan\theta - \nu\theta)\,d\theta
\end{equation}

\chapter{Parabolic cylinder functions}

\begin{equation}
\gls{Dp} = 2^{\frac{p}{2}}e^{-\frac{z^2}{4}}
\left\{
\frac{\surd\pi}{\Gamma\left(\frac{1-p}{2}\right)}
\Phi\left(-\frac{p}{2},\frac{1}{2};\frac{z^2}{2}\right)
-\frac{\sqrt{2\pi}z}{\Gamma\left(-\frac{p}{2}\right)}
\Phi\left(\frac{1-p}{2},\frac{3}{2};\frac{z^2}{2}\right)
\right\}
\end{equation}

\chapter{Elliptical Integral of the First Kind}

\begin{equation}
\gls{Fpk} = \int_0^\phi 
\frac{d\alpha}{\sqrt{1-k^2\sin^2\alpha}}
\end{equation}

\chapter{Constants}

\begin{equation}
\gls{C} = 0.577\,215\,664\,901\ldots
\end{equation}

\begin{equation}
\gls{G} = 0.915\,965\,594\ldots
\end{equation}

\end{document}
%    \end{macrocode}
%    \begin{macrocode}
%</sampleEqPg.tex>
%    \end{macrocode}
%    \begin{macrocode}
%<*sampleNtn.tex>
%    \end{macrocode}
%    \begin{macrocode}
\documentclass{report}

\usepackage[plainpages=false,colorlinks]{hyperref}
\usepackage{html}
%\usepackage{array}
\usepackage[toc,style=long,cols=3]{glossary}

\makeglossary

% Define a new glossary type called notation
\newglossarytype{notation}{not}{ntn}[style=long,cols=2,border,header]

% Set up notation style
\newcommand{\notationname}{Notation}
% Don't display numbers, remove commas and number hyphens
% for notation entries, and put a full stop after the
% deescription:
\setglossary{type=notation,glsnumformat=ignore,glodelim={.}}

\makenotation

\begin{document}

\title{Sample Document using glossary Package}
\author{Nicola Talbot}
\pagenumbering{alph}
\maketitle

\begin{abstract}
%stop hyperref complaining about duplicate page identifiers
\pagenumbering{Alph}
This is a sample document illustrating the use of the
\textsf{glossary} package.  In this example, a new glossary type
called \texttt{notation} is defined, so that the document can have a 
separate glossary of terms and index of notation. The index of notation
doesn't have associated numbers.
\end{abstract}


\pagenumbering{roman}
\tableofcontents

\printglossary

% Either of the following 2 commands will have
% the same effect with LaTeX.  Effect slightly
% different with LaTeX2HTML.

%\printnotation
\printglossary[notation]

\chapter{Introduction}
\pagenumbering{arabic}

Sets\glossary{name=set,description=A collection of distinct objects} 
are denoted by a caligraphic font 
e.g.\ $\mathcal{S}$%
\notation{name=$\mathcal{S}$,description=A set,sort=S}.

Let $\mathcal{U}$ denote the universal set\notation{
name=$\mathcal{U}$,description={The universal set},sort=U}.

The cardinality\glossary{name=cardinality,
description=The number of elements in the specified set} of
a set $\mathcal{S}$ is denoted $|\mathcal{S}|$%
\notation{name=$\mid\mathcal{S}\mid$,
description=cardinality of $\mathcal{S}$,sort=cardinality}

\chapter{Next}

Now for a hyperlink: 
\xnotation{name=$\mathcal{U}$, description={The universal
set}, sort=U}{$\mathcal{U}$}.

\end{document}
%    \end{macrocode}
%    \begin{macrocode}
%</sampleNtn.tex>
%    \end{macrocode}
%    \begin{macrocode}
%<*sampleNtn2.tex>
%    \end{macrocode}
%    \begin{macrocode}
\documentclass{report}

\usepackage[plainpages=false,colorlinks]{hyperref}
\usepackage{html}
\usepackage[toc]{glossary}[2006/07/20]

\makeglossary

% Define a new glossary type called notation
% Suppress the page numbering in the list of notation
\newglossarytype[nlg]{notation}{not}{ntn}[number=none]

% Set up notation style
\newcommand{\notationname}{Notation}

\makenotation

\begin{document}

% Save details for later use (note the use of \protect):
\storeglosentry[notation]{not:set}{name={$\mathcal{S}$},
description=A set,sort=S}

\storeglosentry[notation]{not:U}{name=$\mathcal{U}$,
description={The universal set},sort=U}

\storeglosentry[notation]{not:card}{name=$\mid\mathcal{S}\mid$,
description=cardinality of $\mathcal{S}$,
sort=cardinality}

\storeglosentry{glos:set}{name=set,description=A collection of 
distinct objects}

\storeglosentry{glos:card}{name=cardinality,description=The number of 
elements in the specified set}

\title{Sample Document using glossary Package}
\author{Nicola Talbot}
\pagenumbering{alph}
\maketitle

\begin{abstract}
%stop hyperref complaining about duplicate page identifiers:
\pagenumbering{Alph}
This is a sample document illustrating the use of the
\textsf{glossary} package.  In this example, a new glossary type
called \texttt{notation} is defined, so that the document can have a 
separate glossary of terms and index of notation. The index of notation
doesn't have associated numbers.
\end{abstract}


\pagenumbering{roman}
\tableofcontents

\printglossary

% Either of the following 2 commands will have
% the same effect with LaTeX.  Effect slightly
% different with LaTeX2HTML.

\printnotation
%\printglossary[notation]

\chapter{Introduction}
\pagenumbering{arabic}

Sets\useglosentry{glos:set} 
are denoted by a caligraphic font 
e.g.\ $\mathcal{S}$\useglosentry{not:set}.

Let \gls{not:U} denote the universal set.

The \gls{glos:card} of a set $\mathcal{S}$ is denoted 
\gls{not:card}.

\chapter{Another Chapter}

Another mention of the universal set \gls{not:U}.

\end{document}
%    \end{macrocode}
%    \begin{macrocode}
%</sampleNtn2.tex>
%    \end{macrocode}
%    \begin{macrocode}
%<*sampleSec.tex>
%    \end{macrocode}
%    \begin{macrocode}
\documentclass{report}

\usepackage[plainpages=false,colorlinks]{hyperref}
\usepackage[style=altlist,toc,number=section]{glossary}

\makeglossary

\storeglosentry{ident}{name=identity matrix,description=diagonal 
matrix with 1s along the leading diagonal}

\storeglosentry{diag}{name=diagonal matrix,
description=matrix whose only non-zero entries are along 
the leading diagonal}

\storeglosentry{sing}{name=singular matrix,
description=matrix with zero determinant}

\begin{document}

\pagenumbering{roman}
\tableofcontents

\printglossary

\chapter{Introduction}
\pagenumbering{arabic}
This is a sample document illustrating the use of the
\textsf{glossary} package.

\chapter{Diagonal matrices}

A \gls[format=hyperit]{diag} is a matrix where all elements not on the 
leading diagonal are zero.  This is the
primary definition, so an italic font is used for the page number.

\newpage
\section{Identity matrix}
The \gls[format=hyperit]{ident} is a \gls{diag} whose leading
diagonal elements are all equal to 1.

Here is another entry for a \gls{diag}.

\chapter{Singular Matrices}

A \gls{sing} is a matrix with zero determinant. 
\useGlosentry{sing}{Singular matrices} are non-invertible.

Another \gls{ident} entry.

\end{document}
%    \end{macrocode}
%    \begin{macrocode}
%</sampleSec.tex>
%    \end{macrocode}
%\fi
%\Finale
\endinput
